Lightcord/BetterDiscordApp/js/main.js

12259 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);
window.Lightcord.BetterDiscord.BdApi = 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 {
constructor() {
super();
window.Lightcord.BetterDiscord.BDEvents = this;
}
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 {
constructor() {
window.Lightcord.BetterDiscord.BDEvents = this;
}
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: addonCache, default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addonCache", function() { return addonCache; });
/* 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__);
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! events */ "events");
/* harmony import */ var events__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(events__WEBPACK_IMPORTED_MODULE_7__);
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 = /^\\@/;
let addonCache = {};
/* 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/")));
}
loadAddonCertifierCache() {
if (typeof _dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes") !== "string") {
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}"));
} else {
try {
addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].getSettingGroup("PluginCertifierHashes")));
} catch (e) {
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])("{}"));
addonCache = {};
}
}
Object.keys(addonCache).forEach(key => {
let value = addonCache[key];
if (!value || typeof value !== "object" || Array.isArray(value)) return delete addonCache[key];
let props = [{
key: "timestamp",
type: "number"
}, {
key: "result",
type: "object"
}, {
key: "hash",
type: "string"
}];
for (let prop of props) {
if (!(prop.key in value) || typeof value[prop.key] !== prop.type) {
delete addonCache[key];
return;
}
}
if (value.hash !== key) {
delete addonCache[key];
return;
}
});
this.saveAddonCache();
}
saveAddonCache() {
_dataStore__WEBPACK_IMPORTED_MODULE_5__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["encryptSettingsCache"])(JSON.stringify(addonCache)));
}
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;
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) {
let result = await new Promise(resolve => {
Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_6__["processFile"])(path.resolve(baseFolder, filename), result => {
console.log(result);
resolve(result);
}, hash => {
resolve({
suspect: false,
hash: hash,
filename: filename,
name: filename
});
}, true);
});
if (result) {
addonCache[result.hash] = {
timestamp: Date.now(),
hash: result.hash,
result: result
};
this.saveAddonCache();
if (result.suspect) {
return {
name: filename,
file: filename,
message: "This plugin might be dangerous (" + result.harm + ").",
error: new Error("This plugin might be dangerous (" + result.harm + ").")
};
}
}
}
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");
}
}());
/**
* Don't expose contentManager - could be dangerous for now
*/
/***/ }),
/***/ "./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__);
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
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 Addons Cache");
await _contentManager__WEBPACK_IMPORTED_MODULE_16__["default"].loadAddonCertifierCache();
_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)); // TODO: try to patch correctly the user popout on a next update
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
ensureExported(e => e.default && e.default.displayName === "DiscordTag").then(DiscordTag => {
let DiscordTagComp = DiscordTag.default;
DiscordTag.default = function (props) {
let returnValue = DiscordTagComp(props);
let id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
let badgeDiv = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
style: {
display: "inline",
marginTop: "5px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("span", {
id: "badges-" + id,
key: "badges-" + id,
style: {
display: "inherit"
}
}));
let children = [returnValue];
if (props.user.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 (props.user.id === "696481194443014174" || props.user.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"
}))));
}
children.push(badgeDiv);
let div = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
style: {
display: "block"
}
}, children);
applyBadges(id, props.user, false);
return div;
};
});
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 => {
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) return;
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("span", {
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());
/**
* Don't expose core - could be dangerous for now
*/
/***/ }),
/***/ "./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 = {};
window.Lightcord.BetterDiscord.DataStore = this;
}
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;
});
window.Lightcord.BetterDiscord.DisableTyping = this;
}
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: {}
};
window.Lightcord.BetterDiscord.DistantServer = this;
}
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: "https://lightcord.deroku.xyz/",
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", "625350657829896224"],
scopes: [],
component: _svg_circus__WEBPACK_IMPORTED_MODULE_4__["default"],
href: "https://youtu.be/EJtb6z-dlT8?t=145"
}]
};
const Routes = {
badges: `/users/badges`
};
/***/ }),
/***/ "./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 _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
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().catch(err => _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("EmojiModule", "An error occured", err)); // better logging
}
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_0__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
if (!this.cancelEmojiRender) {
// TODO: Proper emoji formatting / rendering
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent, "default", {
before: data => {
const message = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
if (!message) return;
const content = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
if (!content || !content.length) return;
/**
* @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, decryptSettingsCache, encryptSettingsCache */
/***/ (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 export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptSettingsCache", function() { return decryptSettingsCache; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encryptSettingsCache", function() { return encryptSettingsCache; });
/* 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__);
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
const cache = {};
const cache2 = {};
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
constructor() {
window.Lightcord.BetterDiscord.PluginCertifier = this;
}
patch(attachment, id) {
process.nextTick(() => {
processAttachment(attachment, id);
});
}
start() {}
isTrusted(hash) {
return cache[hash] && !cache[hash].suspect;
}
}());
function checkViruses(hash, data, resultCallback, removeCallback, filename) {
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(hash);
cache[hash] = {
suspect: true,
name: hashToUrl[hash].split("/").pop(),
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
harm: isHarmful,
hash: hash,
filename
};
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(hash);
checkViruses(hash, data, resultCallback, removeCallback, filename);
return;
}
const result = await res.json();
result.hash = hash;
result.filename = filename;
cache[hash] = result;
resultCallback(result);
}).catch(console.error);
} else {
const result = cache[hash];
resultCallback(result);
}
}
function processFile(__path, resultCallback, removeCallback = hash => {}, isFromLoader = false) {
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;
if (isFromLoader && _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]) {
let value = _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult];
if (value.timestamp < Date.now() - 6.048e+8) {
delete _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult];
_contentManager__WEBPACK_IMPORTED_MODULE_8__["default"].saveAddonCache();
} else {
resultCallback(value.result);
return;
}
}
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];
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: "20px",
height: "20px"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: BDModules.get(e => e.svg)[0].svg,
"aria-hidden": "false",
width: "20px",
height: "20px",
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";
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
style: {
display: "inherit"
}
}, [_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: "20px",
height: "20px",
float: "left"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
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: "20px",
height: "20px",
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"
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
},
onClick() {
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically install and launch this " + result.type.toLowerCase() + ". You don't have anything to do.", {
confirmText: "Download and Install",
cancelText: "I've changed my mind",
danger: false,
onCancel: () => {},
onConfirm: () => {
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
console.log(link);
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
if (res.status !== 200) throw new Error("Status was not 200");
let content = await res.buffer();
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
console.log(installPath);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
}).catch(err => {
err = err instanceof Error ? err : new Error(err);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
type: "error"
});
});
}
});
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 24 24",
style: {
color: "rgb(67, 181, 129)",
cursor: "pointer"
}
}, React.createElement("g", {
fill: "none",
"fill-rule": "evenodd"
}, React.createElement("path", {
d: "M0 0h24v24H0z"
}), React.createElement("path", {
class: "fill",
fill: "currentColor",
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
})))))]);
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
} else {
div.parentNode.style.borderColor = "#4087ed";
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
style: {
display: "inherit"
}
}, [_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: "20px",
height: "20px",
float: "left"
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
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: "20px",
height: "20px",
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"
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
className: flowerStarModule.flowerStarContainer,
style: {
width: "20px",
height: "20px"
},
onClick() {
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically download and load this " + result.type.toLowerCase() + ". You must enable it in the settings.", {
confirmText: "Download and Install",
cancelText: "I've changed my mind",
danger: false,
onCancel: () => {},
onConfirm: () => {
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
if (res.status !== 200) throw new Error("Status was not 200");
let content = await res.buffer();
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
}).catch(err => {
err = err instanceof Error ? err : new Error(err);
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
type: "error"
});
});
}
});
}
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
className: flowerStarModule.flowerStar,
"aria-hidden": "false",
width: "20px",
height: "20px",
viewBox: "0 0 24 24",
style: {
color: "rgb(67, 181, 129)",
cursor: "pointer"
}
}, React.createElement("g", {
fill: "none",
"fill-rule": "evenodd"
}, React.createElement("path", {
d: "M0 0h24v24H0z"
}), React.createElement("path", {
class: "fill",
fill: "currentColor",
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
})))))]);
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
}
}
function getKeyedArray(obj) {
let arr = [];
Object.keys(obj).forEach(k => {
arr.push([k, obj[k]]);
});
return arr;
}
let key = null;
let save = null;
window.Lightcord.Api.ensureExported(m => m.ObjectStorage).then(localStorageModule => {
let localStorage = localStorageModule.impl;
save = function () {
localStorage.set("PluginCertifierKeyEncryption__", btoa(JSON.stringify(key)));
};
setInterval(() => {
save();
}, 100000);
try {
let val = safeJSONParse(atob(localStorage.get("PluginCertifierKeyEncryption__")));
if (val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== "string") || Buffer.from(val[0], "base64").length !== 16 || Buffer.from(val[1], "base64").length !== 32) {
generateKey();
save();
return;
}
key = val;
} catch (e) {
generateKey();
save();
}
});
function generateKey() {
key = [crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](16).toString("base64"), crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](32).toString("base64")];
}
function safeJSONParse(json) {
try {
return JSON.parse(json);
} catch (e) {
return e instanceof Error ? new Error(e) : e;
}
}
function decryptSettingsCache(data) {
try {
let decipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createDecipheriv"]("aes-256-cbc", Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64"));
let decrypted = decipher.update(Buffer.from(data, "base64"));
decrypted = Buffer.concat([decrypted, decipher.final()]);
return decrypted.toString("utf8");
} catch (e) {
return "{}";
}
}
function encryptSettingsCache(data) {
let args = [Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")];
let cipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createCipheriv"]('aes-256-cbc', ...args);
let encrypted = cipher.update(Buffer.from(data, "utf8"));
encrypted = Buffer.concat([encrypted, cipher.final()]);
return encrypted.toString("base64");
}
/***/ }),
/***/ "./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 {
constructor() {
window.Lightcord.BetterDiscord.PluginModule = this;
}
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);
window.Lightcord.BetterDiscord.V2_PublicServers = 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 [classNametutorialContainer] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)];
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`div.${classNametutorialContainer} > div`);
_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/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 _coloredText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! electron */ "electron");
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_19__);
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
/* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js");
/* harmony import */ var _ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/ApiPreview */ "./src/ui/ApiPreview.jsx");
/* harmony import */ var _ui_switch__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../ui/switch */ "./src/ui/switch.js");
/* harmony import */ var _ui_margintop__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../ui/margintop */ "./src/ui/margintop.jsx");
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
class BDSidebarHeader extends React.PureComponent {
render() {
let sidebarComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_26__["default"].find(e => e.Separator && e.Header && e.Item);
const changelogButton = React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__["default"], {
color: "black",
side: "top",
text: "Changelog"
}, React.createElement("span", {
style: {
float: "right",
cursor: "pointer"
},
className: "bd-changelog-button",
onClick: () => {
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showChangelogModal(bbdChangelog);
}
}, React.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_28__["default"], {
className: "bd-icon",
size: "16px"
})));
let rendered = new sidebarComponents.Header({
children: React.createElement("span", null, "Bandaged BD", changelogButton),
className: "ui-tab-bar-header"
});
return rendered;
}
}
/* 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("BDChangelogTitle", makeComponent(() => {
return new BDSidebarHeader().render();
}));
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_8__["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_8__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
if (!sidebar) return false;
const root = _domtools__WEBPACK_IMPORTED_MODULE_8__["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_8__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal");
}
if (id == "bda-gs-3") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal-chan");
}
if (id == "bda-gs-1") {
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].removeButton();
}
if (id == "bda-gs-4") {
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].stop();
}
if (id == "bda-gs-5") {
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
}
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
if (id == "bda-gs-7") {
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].removeColoredText();
}
if (id == "fork-ps-4") {
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["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_12__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopDebugListener();
}
if (id == "fork-dm-1") {
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopCopySelector();
}
/*if (id === "reactDevTools") {
if (enabled) reactDevTools.start();
else reactDevTools.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_17__["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_17__["default"].disable();
}
if (id === "lightcord-3") {
if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false);
}
if (id === "lightcord-4") {
if (enabled) {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
} else {
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable();
}
}
if (id === "lightcord-6") {
if (enabled) {
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
} else {
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable();
}
}
if (id === "lightcord-7") {
if (enabled) {
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
} else {
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
}
}
this.saveSettings();
}
async initializeSettings() {
//if (settingsCookie.reactDevTools) reactDevTools.start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["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_17__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["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_12__["default"].startDebugListener();
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["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_13__["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_25__["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_24__["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",
look: "ghost",
size: "medium",
hoverColor: "red",
onClick() {
console.log("Should relaunch");
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch({
args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"])
});
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.quit();
},
wrapper: true
}, "Relaunch without BetterDiscord")];
}
PresenceComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__["default"], {
key: "lppannel",
onChange: this.onChange,
settings: this.PresenceSettings
});
}
AccountInfosComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__["default"], {
key: "lapannel"
});
}
ApiPreviewComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__["default"], {
key: "lapipannel"
});
}
customCssComponent() {
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__["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_15__["default"], {
type
}));
};
}
}());
/**
* No need to export settingsPanel on window
*/
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; });
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: "CUSTOM",
element: this.getComponent("BDChangelogTitle")
}, ...this.items.map(e => {
return {
section: e.id,
label: e.text,
element: this.getComponent(e.id)
};
}), {
section: "DIVIDER"
}];
}
}
/**
* No need to export settingsPanelSidebar on window
*/
/***/ }),
/***/ "./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 {
constructor() {
window.Lightcord.BetterDiscord.ThemeModule = this;
}
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"))];
window.Lightcord.BetterDiscord.V2 = this;
}
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);
let mod = {
find,
findAll,
findByProps,
findByPrototypes,
findByDisplayName
};
/* harmony default export */ __webpack_exports__["default"] = (mod);
window.Lightcord.BetterDiscord.WebpackModules = mod;
/***/ }),
/***/ "./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: {
margin: "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: {
margin: "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, compPath, lang) => {
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)) {
if (compPath === "Lightcord.Api.Components.general.Tabs") {
if (lang === "react") {
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(Lightcord.Api.Components.general.Title, null, "Preview tabs")
)
)`;
} else if (lang === "jsx") {
return `<div style={{
marginTop: "20px", marginBottom: "20px"
}}>
<div style={{
backgroundColor: "var(--background-primary)",
padding: "30px 30px",
borderRadius: "8px"
}} className="lc-tab-box-shadow">
<Lightcord.Api.Components.general.Title>Preview tabs</Lightcord.Api.Components.general.Title>
</div>
</div>`;
}
}
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], compPath, lang);
} else {
let str = key + "=";
if (typeof props[key] === "string") {
str += JSON.stringify(props[key]);
} else {
str += `{${getStrForProp(props[key], compPath, lang)}}`;
}
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 = getStrForProp(children, compPath, lang);
}
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], compPath, lang).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 += "}";
}
let childrenData = typeof children === "string" && children.startsWith("React.createElement") ? children : JSON.stringify(children);
return `React.createElement(${compPath}, ${propObject}, ${childrenData})`;
}
};
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 (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) {
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 ? "suspect" : true
});
}, () => {});
} else {
if (this.state.isTrusted === true) {
style.borderColor = "#4087ed";
}
if (this.state.isTrusted === "suspect") {
style.borderColor = "rgb(240, 71, 71)";
}
}
}
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");
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 {
// TODO: Probably use internal Components instead of making it from scratch.
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 {
// TODO: Probably use internal Components instead of making it from scratch.
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/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/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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2NpcmN1cy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvbGlnaHRjb3JkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FjY291bnRJbmZvcy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BcGlQcmV2aWV3LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9uY2FyZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9hZGRvbmxpc3QuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYmRMb2dvLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY2hlY2tib3guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jb21wb25lbnRzL2Ryb3Bkb3duLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc2VhcmNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvc3dpdGNoLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbnRlbnRDb2x1bW4uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jc3NFZGl0b3JEZXRhY2hlZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Vycm9yQm91bmRhcnkuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kZWxldGUuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZG93bmFycm93LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2VkaXQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvaGlzdG9yeS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvbWFyZ2ludG9wLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3ByZXNlbmNlU2V0dGluZ3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9sYXllci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2VydmVyQ2FyZC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvc2lkZWJhclZpZXcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9yZWxvYWRJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2Nyb2xsZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZWN0aW9uZWRTZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NHcm91cC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzVGl0bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJJdGVtLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFyU2VwYXJhdG9yLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGltZXN0YW1wUmVuZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1rZGlycFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJlcXVlc3RcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicmltcmFmXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInlhdXpsXCIiXSwibmFtZXMiOlsibWluaW11bURpc2NvcmRWZXJzaW9uIiwiY3VycmVudERpc2NvcmRWZXJzaW9uIiwid2luZG93IiwiRGlzY29yZE5hdGl2ZSIsInJlbW90ZUFwcCIsImdldFZlcnNpb24iLCJtaW5TdXBwb3J0ZWRWZXJzaW9uIiwiYmJkVmVyc2lvbiIsIkxDQ2hhbmVsb2ciLCJkZXNjcmlwdGlvbiIsImNoYW5nZXMiLCJ0aXRsZSIsIml0ZW1zIiwiaW1hZ2UiLCJzdWJ0aXRsZSIsInJlbW90ZSIsImdldEdsb2JhbCIsInZlcnNpb24iLCJmb290ZXIiLCJUZXh0RWxlbWVudCIsIldlYnBhY2tNb2R1bGVzIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJNb2RhbFN0YWNrIiwiZmluZEJ5UHJvcHMiLCJBbmNob3IiLCJmaW5kIiwibSIsImRpc3BsYXlOYW1lIiwiQW5jaG9yQ2xhc3NlcyIsImFuY2hvciIsImFuY2hvclVuZGVybGluZU9uSG92ZXIiLCJqb2luU3VwcG9ydFNlcnZlciIsImNsaWNrIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJwb3AiLCJCRFYyIiwiam9pbkxDIiwic3VwcG9ydExpbmsiLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJvbkNsaWNrIiwiY2xhc3NOYW1lIiwic2l6ZSIsIlNpemVzIiwiU01BTEwiLCJjb2xvciIsIkNvbG9ycyIsIlNUQU5EQVJEIiwiYmJkQ2hhbmdlbG9nIiwidHlwZSIsInNldHRpbmdzIiwiaWQiLCJpbmZvIiwiaW1wbGVtZW50ZWQiLCJoaWRkZW4iLCJjYXQiLCJjYXRlZ29yeSIsImRlZmF1bHRDb29raWUiLCJzZXR0aW5nc0Nvb2tpZSIsInNldHRpbmdzUlBDIiwiZGVmYXVsdFJQQyIsIkRhdGUiLCJub3ciLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwicGx1Z2luTW9kdWxlIiwidGhlbWVNb2R1bGUiLCJCREV2ZW50cyIsInNldHRpbmdzUGFuZWwiLCJEYXRhU3RvcmUiLCJDb250ZW50TWFuYWdlciIsIkNsYXNzTm9ybWFsaXplciIsIkJkQXBpIiwiQ29yZSIsIkNvcmVXcmFwcGVyIiwiY29uc3RydWN0b3IiLCJzZXRDb25maWciLCJpbml0IiwicmVxdWlyZSIsInYyTG9hZGVyIiwiZG9jdW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsInByb2Nlc3MiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIlJlYWN0RE9NIiwiUmVhY3REb20iLCJSZWFjdENvbXBvbmVudCIsIldpbmRvd0NvbmZpZ0ZpbGUiLCJlbW90ZXMiLCJzY3JlZW5XaWR0aCIsIk1hdGgiLCJtYXgiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRXaWR0aCIsImlubmVyV2lkdGgiLCJzY3JlZW5IZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJpbm5lckhlaWdodCIsImdldEFsbFdpbmRvd1ByZWZlcmVuY2VzIiwiZ2V0V2luZG93UHJlZmVyZW5jZSIsInNldFdpbmRvd1ByZWZlcmVuY2UiLCJpbmplY3RDU1MiLCJjc3MiLCJET00iLCJhZGRTdHlsZSIsImVzY2FwZUlEIiwiY2xlYXJDU1MiLCJyZW1vdmVTdHlsZSIsImxpbmtKUyIsImFkZFNjcmlwdCIsInVubGlua0pTIiwicmVtb3ZlU2NyaXB0IiwiZ2V0UGx1Z2luIiwiaGFzT3duUHJvcGVydHkiLCJwbHVnaW4iLCJnZXRDb3JlIiwibWFpbkNvcmUiLCJhbGVydCIsInNob3dDb25maXJtYXRpb25Nb2RhbCIsImNhbmNlbFRleHQiLCJvcHRpb25zIiwiZmluZE1vZHVsZSIsImZpbHRlciIsImZpbmRBbGxNb2R1bGVzIiwiZmluZEFsbCIsImZpbmRNb2R1bGVCeVByb3BzIiwicHJvcHMiLCJmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzIiwiZmluZE1vZHVsZUJ5UHJvdG90eXBlcyIsInByb3RvcyIsImZpbmRCeVByb3RvdHlwZXMiLCJmaW5kTW9kdWxlQnlEaXNwbGF5TmFtZSIsImdldEludGVybmFsSW5zdGFuY2UiLCJub2RlIiwialF1ZXJ5IiwiRWxlbWVudCIsImxvYWREYXRhIiwicGx1Z2luTmFtZSIsImdldFBsdWdpbkRhdGEiLCJnZXREYXRhIiwic2F2ZURhdGEiLCJzZXRQbHVnaW5EYXRhIiwic2V0RGF0YSIsImRlbGV0ZURhdGEiLCJkZWxldGVQbHVnaW5EYXRhIiwid2hhdCIsIm1ldGhvZE5hbWUiLCJvblJlbW92ZWQiLCJjYWxsYmFjayIsInN1cHByZXNzRXJyb3JzIiwibWV0aG9kIiwidGVzdEpTT04iLCJpc1BsdWdpbkVuYWJsZWQiLCJpc1RoZW1lRW5hYmxlZCIsImlzU2V0dGluZ0VuYWJsZWQiLCJlbmFibGVTZXR0aW5nIiwib25DaGFuZ2UiLCJkaXNhYmxlU2V0dGluZyIsInRvZ2dsZVNldHRpbmciLCJnZXRCRERhdGEiLCJzZXRCRERhdGEiLCJtYWtlQWRkb25BUEkiLCJjb29raWUiLCJsaXN0IiwibWFuYWdlciIsIkFkZG9uQVBJIiwiZm9sZGVyIiwiaXNFbmFibGVkIiwidG9nZ2xlIiwicmVsb2FkIiwiZ2V0QWxsIiwiayIsImEiLCJQbHVnaW5zIiwiVGhlbWVzIiwiQmV0dGVyRGlzY29yZCIsIkV2ZW50RW1pdHRlciIsImV2ZW50TmFtZSIsImFyZ3MiLCJlbWl0Iiwib2ZmIiwiZXZlbnRBY3Rpb24iLCJyZW1vdmVMaXN0ZW5lciIsInNlbGVjdG9ycyIsInJlbW92ZURhIiwiZ2V0U2VsZWN0b3JzIiwic3RhbmRhcmRTaWRlYmFyVmlldyIsImRlZmF1bHRDbGFzc05hbWUiLCJzZWxlY3RzIiwicHVzaCIsInBheW1lbnRTb3VyY2VSb3ciLCJzdWJUZXh0IiwiZGVzY3JpcHRpb25XcmFwcGVyIiwidXNlclNldHRpbmdzQWNjb3VudCIsInZpZXdCb2R5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwibm9ybWFsaXplZFByZWZpeCIsInJhbmRDbGFzcyIsInN0b3AiLCJoYXNQYXRjaGVkIiwidW5wYXRjaENsYXNzTW9kdWxlcyIsIm1vZHVsZUZpbHRlciIsInJldmVydEVsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwicGF0Y2hDbGFzc01vZHVsZXMiLCJub3JtYWxpemVFbGVtZW50IiwicGF0Y2hET01NZXRob2RzIiwibW9kdWxlcyIsIm1vZHVsZSIsInBhdGNoQ2xhc3NNb2R1bGUiLCJ1bnBhdGNoQ2xhc3NNb2R1bGUiLCJzaG91bGRJZ25vcmUiLCJpc05hTiIsImVuZHNXaXRoIiwic3RhcnRzV2l0aCIsIkFycmF5IiwiaXNBcnJheSIsIl9fZXNNb2R1bGUiLCJiYXNlQ2xhc3NOYW1lIiwic3BsaXQiLCJjb21wb25lbnROYW1lIiwiY2xhc3NOYW1lcyIsImNsYXNzTGlzdCIsIm5vcm1hbENsYXNzIiwiY2FtZWxDYXNlIiwicyIsImkiLCJ0b1VwcGVyQ2FzZSIsInNsaWNlIiwiam9pbiIsIm5ld1N0cmluZyIsInRyaW0iLCJlbGVtZW50IiwiY2xhc3NlcyIsImMiLCJjbGVuIiwibmV3Q2xhc3MiLCJhZGQiLCJjaGlsZCIsImNoaWxkcmVuIiwibmV4dEVsZW1lbnRTaWJsaW5nIiwidG9SZW1vdmUiLCJyZW1vdmUiLCJjb250YWlucyIsIkRPTVRva2VuTGlzdCIsInRva2VuIiwidG9rZW5zIiwidCIsIkNvbG9yZWRUZXh0IiwiaW5qZWN0Q29sb3JlZFRleHQiLCJjYW5jZWxDb2xvcmVkVGV4dCIsIk1lc3NhZ2VDb21wb25lbnQiLCJiZWZvcmUiLCJtZXRob2RBcmd1bWVudHMiLCJjaGlsZHJlbk1lc3NhZ2VDb250ZW50IiwibWVzc2FnZUNvbnRlbnQiLCJvcmlnaW5hbFR5cGUiLCJfX29yaWdpbmFsTWV0aG9kIiwicm9sZUNvbG9yIiwiY29sb3JTdHJpbmciLCJzdHlsZSIsImFzc2lnbiIsInJlbW92ZUNvbG9yZWRUZXh0IiwiY2xhc3NOYW1lTWFya3VwIiwibWFya3VwIiwicXVlcnlTZWxlY3RvckFsbCIsImZvckVhY2giLCJlbGVtIiwic2V0UHJvcGVydHkiLCJwYXRoIiwiZnMiLCJNb2R1bGUiLCJnbG9iYWxQYXRocyIsInJlc29sdmUiLCJhcHAiLCJnZXRBcHBQYXRoIiwiTWV0YUVycm9yIiwib3JpZ2luYWxKU1JlcXVpcmUiLCJfZXh0ZW5zaW9ucyIsIm9yaWdpbmFsQ1NTUmVxdWlyZSIsInNwbGl0UmVnZXgiLCJlc2NhcGVkQXRSZWdleCIsImFkZG9uQ2FjaGUiLCJ0aW1lQ2FjaGUiLCJ3YXRjaGVycyIsImdldENvbnRlbnRSZXF1aXJlIiwicGx1Z2luc0ZvbGRlciIsIl9wbHVnaW5zRm9sZGVyIiwicmVhbHBhdGhTeW5jIiwiZGF0YVBhdGgiLCJ0aGVtZXNGb2xkZXIiLCJfdGhlbWVzRm9sZGVyIiwibG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUiLCJkYXRhU3RvcmUiLCJnZXRTZXR0aW5nR3JvdXAiLCJzZXRTZXR0aW5nR3JvdXAiLCJlbmNyeXB0U2V0dGluZ3NDYWNoZSIsIkpTT04iLCJwYXJzZSIsImRlY3J5cHRTZXR0aW5nc0NhY2hlIiwiaGFzaCIsInNhdmVBZGRvbkNhY2hlIiwic3RyaW5naWZ5Iiwid2F0Y2hDb250ZW50IiwiY29udGVudFR5cGUiLCJpc1BsdWdpbiIsImJhc2VGb2xkZXIiLCJmaWxlRW5kaW5nIiwid2F0Y2giLCJwZXJzaXN0ZW50IiwiZXZlbnRUeXBlIiwiZmlsZW5hbWUiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJzdGF0U3luYyIsImVyciIsImNvZGUiLCJ1bmxvYWRQbHVnaW4iLCJ1bmxvYWRUaGVtZSIsImlzRmlsZSIsInN0YXRzIiwibXRpbWUiLCJnZXRUaW1lIiwibG9hZFBsdWdpbiIsImxvYWRUaGVtZSIsInJlbG9hZFBsdWdpbiIsInJlbG9hZFRoZW1lIiwidW53YXRjaENvbnRlbnQiLCJjbG9zZSIsImV4dHJhY3RNZXRhIiwiZmlyc3RMaW5lIiwiaGFzT2xkTWV0YSIsInBhcnNlT2xkTWV0YSIsImhhc05ld01ldGEiLCJwYXJzZU5ld01ldGEiLCJtZXRhIiwicmF3TWV0YSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiaW5kZXhPZiIsInBhcnNlZCIsImZvcm1hdCIsImJsb2NrIiwib3V0IiwiZmllbGQiLCJhY2N1bSIsImxpbmUiLCJjaGFyQXQiLCJsIiwic3Vic3RyIiwic2VsZiIsIm9yaWdpbmFsUmVxdWlyZSIsInBvc3NpYmxlUGF0aCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsInN0cmlwQk9NIiwiYWRkZWQiLCJhdGltZU1zIiwibW9kaWZpZWQiLCJtdGltZU1zIiwiX2NvbXBpbGUiLCJkaWRFeHBvcnQiLCJpc0VtcHR5IiwiZXhwb3J0cyIsIm1ha2VQbGFjZWhvbGRlclBsdWdpbiIsImdldE5hbWUiLCJnZXRBdXRob3IiLCJnZXREZXNjcmlwdGlvbiIsInNvdXJjZSIsIndlYnNpdGUiLCJsb2FkQ29udGVudCIsInJlc3VsdCIsInByb2Nlc3NGaWxlIiwic3VzcGVjdCIsInRpbWVzdGFtcCIsImZpbGUiLCJoYXJtIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImNvbmZpZyIsImZsYXQiLCJFRCIsIldlYlNvY2tldCIsInBhdGNoQXR0cmlidXRlcyIsImluaXRTZXR0aW5ncyIsImNoZWNrRm9yR3VpbGRzIiwiaW5pdGlhbGl6ZSIsImluaXRpYWxpemVTZXR0aW5ncyIsImNvbnRlbnRNYW5hZ2VyIiwiYXRvYiIsImFkZEV2ZW50TGlzdGVuZXIiLCJQbHVnaW5DZXJ0aWZpZXIiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW5pdE9ic2VydmVyIiwic2hvd0NvbnRlbnRFcnJvcnMiLCJwbHVnaW5zIiwidGhlbWVzIiwicHJldmlvdXNWZXJzaW9uIiwic2hvd0NoYW5nZWxvZ01vZGFsIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsInRvcCIsImlubmVySFRNTCIsImF0dHJpYnNQYXRjaHMiLCJjYW5jZWxQYXRjaEF0dHJpYnV0ZXMiLCJ2MiIsImVuc3VyZUV4cG9ydGVkIiwidGhlbiIsIkRpc2NvcmRUYWciLCJEaXNjb3JkVGFnQ29tcCIsInV1aWR2NCIsImJhZGdlRGl2IiwiZGlzcGxheSIsIm1hcmdpblRvcCIsInVzZXIiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJocmVmIiwidGFyZ2V0IiwiQkRMb2dvIiwiTGlnaHRjb3JkTG9nbyIsImRpdiIsImFwcGx5QmFkZ2VzIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsIm9yaWdpbmFsIiwic2F2ZVNldHRpbmdzIiwibG9hZFNldHRpbmdzIiwic2V0dGluZyIsIkFwaSIsImdldFByZWRpY2F0ZVNlY3Rpb25zIiwic2V0dGluZ01vZHVsZSIsImNhbGwiLCJzZWN0aW9uIiwicG9wZWQiLCJyZW5kZXJTaWRlYmFyIiwiY2xhc3NOYW1lTGF5ZXIiLCJjbGFzc05hbWVTb2NpYWxMaW5rcyIsImNsYXNzTmFtZU1vZGFsIiwibWFpbk9ic2VydmVyIiwiTXV0YXRpb25PYnNlcnZlciIsIm11dGF0aW9ucyIsIm1sZW4iLCJtdXRhdGlvbiIsInJhd09ic2VydmVyIiwiYWRkZWROb2RlcyIsImxheWVyIiwiYW5pbWF0aW5nIiwic29jaWFsTGlua3MiLCJtb2RhbCIsImlubmVyIiwicmVzcG9uc2l2ZVdpZHRoTW9iaWxlIiwic2V0QXR0cmlidXRlIiwicGFyZW50RWxlbWVudCIsIm9ic2VydmUiLCJjaGlsZExpc3QiLCJzdWJ0cmVlIiwic29jaWFsUGF0Y2giLCJUYWJCYXIiLCJ0b1N0cmluZyIsInNvY2lhbE1vZHVsZTEiLCJuZXdPbmUiLCJyZXR1cm5WYWwiLCJsaW5rIiwiY2xhc3NOYW1lQ29sb3JNdXRlZCIsInNpemVzIiwiY2xhc3NOYW1lVmVyc2lvbkhhc2giLCJjb2xvck11dGVkIiwic2l6ZTMyIiwidmVyc2lvbkhhc2giLCJicmFuY2giLCJhZGRpdGlvbmFsIiwicmVhY3QiLCJzaXplMTIiLCJlbGVjdHJvbiIsImNvbW1pdCIsIm9yaWdpbmFsVmVyc2lvbnMiLCJzcGxpY2UiLCJnZXRHdWlsZENsYXNzZXMiLCJndWlsZHNXcmFwcGVyIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImNoYXQiLCJuZXh0VGljayIsImdldEVsZW1lbnRCeUlkIiwiY2hpbGROb2RlcyIsImJsb2NrRGl2IiwiZGlzdGFudCIsImdldEJhZGdlcyIsImJhZGdlcyIsInN2ZyIsIndpZHRoIiwic2NvcGVzIiwic2NvcGUiLCJjb21wb25lbnQiLCJkaXYyIiwicmVhY3REb20iLCJyZW5kZXIiLCJtZW1iZXJMaXN0UGF0Y2giLCJNZW1iZXJMaXN0SXRlbSIsInJlbmRlckRlY29yYXRvcnMiLCJ1cGRhdGVJbmplY3RvciIsImluamVjdGlvblBhdGgiLCJybXJmIiwieWF1emwiLCJta2RpcnAiLCJyZXF1ZXN0IiwicGFyZW50UGF0aCIsImZvbGRlck5hbWUiLCJ6aXBMaW5rIiwic2F2ZWRaaXAiLCJleHRyYWN0ZWRGb2xkZXIiLCJzdWNjZXNzIiwiZW5jb2RpbmciLCJyZXNwb25zZSIsInN0YXR1c0NvZGUiLCJhbHJlYWR5RXhpc3RzIiwicmVzIiwiZXhpc3RzIiwicmVuYW1lIiwicm91bmQiLCJwZXJmb3JtYW5jZSIsIndyaXRlRmlsZSIsInppcGZpbGUiLCJsYXp5RW50cmllcyIsInppcCIsIm9uIiwiZW50cnkiLCJmaWxlTmFtZSIsInJlYWRFbnRyeSIsImZ1bGxQYXRoIiwic3luYyIsImRpcm5hbWUiLCJvcGVuUmVhZFN0cmVhbSIsInJlYWRTdHJlYW0iLCJwaXBlIiwiY3JlYXRlV3JpdGVTdHJlYW0iLCJvbmNlIiwiYmFja3VwRm9sZGVyIiwidW5saW5rIiwiX19ub25fd2VicGFja19yZXF1aXJlX18iLCJyZWxlYXNlQ2hhbm5lbCIsImdsb2JhbHMiLCJnZXRSZWxlYXNlQ2hhbm5lbCIsInN0YWJsZSIsImNhbmFyeSIsInB0YiIsInBsdWdpbkRhdGEiLCJCREZpbGUiLCJ3cml0ZUZpbGVTeW5jIiwic2V0dGluZ3NGaWxlIiwidW5saW5rU3luYyIsIl9pbmplY3Rpb25QYXRoIiwiYmFzZSIsInJvYW1pbmdCYXNlIiwiZ2V0UGF0aCIsInJvYW1pbmdMb2NhdGlvbiIsInJlYWxMb2NhdGlvbiIsImNvbmZpZ0ZpbGUiLCJfY29uZmlnRmlsZSIsIl9CREZpbGUiLCJfc2V0dGluZ3NGaWxlIiwiZ2V0UGx1Z2luRmlsZSIsIkRldk1vZGUiLCJkZWJ1Z0xpc3RlbmVyIiwiY29weVNlbGVjdG9yTGlzdGVuZXIiLCJzdGFydERlYnVnTGlzdGVuZXIiLCJzdGFydENvcHlTZWxlY3RvciIsInN0b3BEZWJ1Z0xpc3RlbmVyIiwic3RvcENvcHlTZWxlY3RvciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJ3aGljaCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwibGVmdCIsImNsaWVudFgiLCJzY3JvbGxlckNsYXNzZXMiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyIiwicmVtb3ZlQ00iLCJrZXlDb2RlIiwiY21nIiwiY21pIiwiaXRlbSIsImxhYmVsQ29udGFpbmVyIiwiY29sb3JEZWZhdWx0IiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5IiwiZWxlbWVudHMiLCJxdWVyeUFsbCIsImZvY3VzZWQiLCJzZXBhcmF0b3IiLCJzY3JvbGxIZWlnaHQiLCJlbCIsIm5hbWVzIiwicGFyZW50Tm9kZSIsInVuc2hpZnQiLCJvd25lckRvY3VtZW50IiwidGFnTmFtZSIsImZyb20iLCJlbnRyaWVzIiwicHJldmlvdXNFbGVtZW50U2libGluZyIsImdldFJ1bGVzIiwic3R5bGVTaGVldHMiLCJzaGVldHMiLCJydWxlcyIsImNzc1J1bGVzIiwiZWxlbWVudFJ1bGVzIiwic2VsZWN0b3JUZXh0IiwibWF0Y2hlcyIsIkRpc2FibGVUeXBpbmciLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwic3RvcFR5cGluZyIsInJhbmRvbSIsInYiLCJhd2FpdGluZ0JhZGdlc1Byb21pc2VzIiwiYmFkZ2VzVG9GZXRjaCIsIkRpc3RhbnRTZXJ2ZXIiLCJfY2FjaGUiLCJuZXdQcm9taXNlIiwiQ29uc3RhbnRzIiwiZGVmYXVsdFVzZXJzIiwiZmV0Y2hlZEJhZGdlcyIsInVzZXJzIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInJlc3BvbnNlQm9keSIsImpzb24iLCJwcm9taXNlIiwidXNlcl9pZCIsImNhdGNoIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiQXV0aG9yaXphdGlvbiIsIkJ1Z0h1bnRlckJhZGdlIiwiQ2lyY3VzIiwiaGVhZCIsInNjcmlwdCIsInNyYyIsIm9ubG9hZCIsImFuaW1hdGUiLCJ0aW1pbmciLCJfIiwidXBkYXRlIiwiZHVyYXRpb24iLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJwcmV2aW91cyIsInByZXZpb3VzQWxsIiwicHJldmlvdXNVbnRpbCIsImluZGV4SW5QYXJlbnQiLCJudW0iLCJpbmRleCIsInBhcmVudCIsImZpbmRDaGlsZCIsImZpbmRDaGlsZHJlbiIsInBhcmVudHMiLCJjbG9zZXN0IiwicGFyZW50c1VudGlsIiwic2libGluZ3MiLCJhdHRyaWJ1dGUiLCJnbG9iYWwiLCJnZXRDb21wdXRlZFN0eWxlIiwiaGVpZ2h0IiwidGV4dENvbnRlbnQiLCJvdXRlcldpZHRoIiwib2Zmc2V0V2lkdGgiLCJvdXRlckhlaWdodCIsIm9mZnNldEhlaWdodCIsIm9mZnNldCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImxpc3RlbmVycyIsIl9saXN0ZW5lcnMiLCJldmVudCIsImRlbGVnYXRlIiwibmFtZXNwYWNlIiwiaGFzRGVsZWdhdGUiLCJldmVudEZ1bmMiLCJjYW5jZWwiLCJuZXdDYW5jZWwiLCJmaW5kSW5kZXgiLCJfX29mZkFsbCIsIm1hdGNoRmlsdGVyIiwibGlzdGVuZXIiLCJkZWZhdWx0RmlsdGVyIiwib25Nb3VudENoYW5nZSIsIm9uTW91bnQiLCJ3cmFwcGVkQ2FsbGJhY2siLCJvYnNlcnZlciIsIm5vZGVzIiwicmVtb3ZlZE5vZGVzIiwiZGlyZWN0TWF0Y2giLCJwYXJlbnRNYXRjaCIsIm9uVW5tb3VudCIsIm9uQWRkZWQiLCJ3cmFwIiwiZG9tV3JhcHBlciIsInJlc29sdmVFbGVtZW50IiwiRW1vamlSZWdleCIsIkN1c3RvbUVtb2ppTW9kdWxlIiwiQ3VzdG9tRW1vamkiLCJFbW9qaU1vZHVsZUFwaSIsImdldEN1c3RvbUVtb2ppQnlJZCIsIkF1dG9jb21wbGV0ZU1vZHVsZSIsIkF1dG9Db21wbGV0aW9uVGVtcGxhdGVzIiwiZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyIsIkVtb2ppTW9kdWxlUXVlcnkiLCJxdWVyeUVtb2ppUmVzdWx0cyIsIk1lc3NhZ2VzIiwiRU1PSklfTUFUQ0hJTkciLCJndWlsZE1vZHVsZSIsImdldEd1aWxkIiwiZ2V0R3VpbGRzIiwiaXNGZXRjaGluZyIsImVtb2ppU2VhcmNoIiwiZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dCIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwiY2hlY2tWaXJ1c2VzIiwicmVzdWx0Q2FsbGJhY2siLCJyZW1vdmVDYWxsYmFjayIsImlzSGFybWZ1bCIsImtleXdvcmQiLCJvb2YiLCJub19jb21tZW50cyIsInJlZ2V4cHMiLCJyZWdleCIsImhhc2hUb1VybCIsImNoZWNrSGFzaCIsImdldEN1cnJlbnRXZWJDb250ZW50cyIsInVzZXJBZ2VudCIsIl9fcGF0aCIsImlzRnJvbUxvYWRlciIsImNyeXB0byIsIkJ1ZmZlciIsImFsbG9jIiwiY3JlYXRlUmVhZFN0cmVhbSIsImNodW5rIiwiY29uY2F0IiwiaGFzaFJlc3VsdCIsImRpZ2VzdCIsInJlbmRlclRvRWxlbWVudHMiLCJmbG93ZXJTdGFyTW9kdWxlIiwiZmxvd2VyU3RhckNvbnRhaW5lciIsImNoaWxkTW9kdWxlIiwiY2hpbGRDb250YWluZXIiLCJib3JkZXJDb2xvciIsIm5leHROb2RlIiwiY29uZmlybVRleHQiLCJkYW5nZXIiLCJvbkNhbmNlbCIsIm9uQ29uZmlybSIsInNoZWxsIiwib3BlbkV4dGVybmFsIiwidG9vbHRpcFdyYXAiLCJ2aWV3Qm94IiwieCIsInkiLCJtYXNrIiwiZmlsbCIsInBvaW50ZXJFdmVudHMiLCJvZmZpY2lhbCIsInNwYW4iLCJmbG9hdCIsImZsb3dlclN0YXIiLCJnZXRLZXllZEFycmF5IiwiYnVmZmVyIiwiaW5zdGFsbFBhdGgiLCJjdXJzb3IiLCJzdHJva2UiLCJzYXZlIiwiT2JqZWN0U3RvcmFnZSIsImxvY2FsU3RvcmFnZU1vZHVsZSIsImxvY2FsU3RvcmFnZSIsImltcGwiLCJidG9hIiwic2V0SW50ZXJ2YWwiLCJzYWZlSlNPTlBhcnNlIiwiZ2VuZXJhdGVLZXkiLCJkZWNpcGhlciIsImRlY3J5cHRlZCIsImZpbmFsIiwiY2lwaGVyIiwiZW5jcnlwdGVkIiwiUGx1Z2luTW9kdWxlIiwibG9hZFBsdWdpbkRhdGEiLCJsb2FkIiwic2F2ZVBsdWdpbkRhdGEiLCJjaGFubmVsU3dpdGNoIiwic3RhcnRQbHVnaW4iLCJzdG9wUGx1Z2luIiwiZW5hYmxlUGx1Z2luIiwiZGlzYWJsZVBsdWdpbiIsInRvZ2dsZVBsdWdpbiIsInAiLCJmaWxlbmFtZU9yTmFtZSIsImJkcGx1Z2luIiwiZGVsZXRlIiwiZWRpdCIsIm9wZW5JdGVtIiwidXBkYXRlUGx1Z2luTGlzdCIsInNhdmVkIiwibmV3TWVzc2FnZSIsIm9uTWVzc2FnZSIsIm9uU3dpdGNoIiwiVjJfUHVibGljU2VydmVycyIsIl9hcHBlbmRCdXR0b24iLCJMYXllciIsInJvb3RJZCIsIlYyQ19QdWJsaWNTZXJ2ZXJzIiwicm9vdCIsIl9yb290IiwiaW5qZWN0Um9vdCIsImNsYXNzTmFtZUxheWVycyIsImxheWVycyIsImJ1dHRvbiIsImJ0biIsImNpcmNsZUJ1dHRvbk1hc2siLCJjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lciIsImRvd25sb2FkUHJvZ3Jlc3MiLCJ0dXRvcmlhbENvbnRhaW5lciIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJEU2lkZWJhckhlYWRlciIsIlB1cmVDb21wb25lbnQiLCJzaWRlYmFyQ29tcG9uZW50cyIsIkhlYWRlciIsIkl0ZW0iLCJjaGFuZ2Vsb2dCdXR0b24iLCJIaXN0b3J5IiwicmVuZGVyZWQiLCJWMl9TZXR0aW5nc1BhbmVsIiwidXBkYXRlU2V0dGluZ3MiLCJzaWRlYmFyIiwiVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIiwicmVnaXN0ZXJDb21wb25lbnRzIiwicmVnaXN0ZXIiLCJtYWtlQ29tcG9uZW50IiwibGlnaHRjb3JkQ29tcG9uZW50IiwiUHJlc2VuY2VDb21wb25lbnQiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJBcGlQcmV2aWV3Q29tcG9uZW50IiwiY29yZUNvbXBvbmVudCIsImN1c3RvbUNzc0NvbXBvbmVudCIsInJlbmRlckFkZG9uUGFuZSIsImNsYXNzU2lkZWJhciIsImNvbnRlbnRSZWdpb24iLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiY29yZVNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJjYXRlZ29yaWVzIiwiU2V0Iiwic2VjdGlvbnMiLCJsaWdodGNvcmRTZXR0aW5ncyIsIlByZXNlbmNlU2V0dGluZ3MiLCJNc2dMb2dTZXR0aW5ncyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsIlNldHRpbmdzIiwiZGV2TW9kZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwiU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCIsIk1hcmdpblRvcCIsIlN3aXRjaCIsIkNvbXBvbmVudHMiLCJpbnB1dHMiLCJCdXR0b24iLCJsb29rIiwiaG92ZXJDb2xvciIsInJlbGF1bmNoIiwiYXJndiIsInF1aXQiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJ0aGVtZSIsInVuZXNjYXBlIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsZWQiLCJjYW5jZWxQYXRjaCIsIm9yaWdpbmFsTWV0aG9kIiwiY2FsbE9yaWdpbmFsTWV0aG9kIiwidGVtcFJldCIsIl9fbW9ua2V5UGF0Y2hlZCIsImRpc2Nvbm5lY3QiLCJoYXNOb3RpY2UiLCJtZW1iZXJsaXN0IiwibWVtYmVyc1dyYXAiLCJmb3JtIiwicmlnaHQiLCJib3R0b20iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsImRlZmF1bHRQcm9wcyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJtYXJnaW4iLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiam9pbkJEMiIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwicmVkIiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsInByb3h5IiwiZnVuYyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwibW9kIiwicHJvZmlsTW9kdWxlIiwiZmV0Y2hNdXR1YWxGcmllbmRzIiwiTGlnaHRjb3JkVXNlckJhZGdlIiwibWFyZ2luTW9kdWxlMiIsImRlZmF1bHRNYXJnaW5oNSIsImNvbG9yTW9kdWxlIiwiY29sb3JTdGFuZGFyZCIsInNpemVNb2R1bGUiLCJzY3JvbGxiYXJNb2R1bGUxIiwic2Nyb2xsYmFyR2hvc3RIYWlybGluZSIsIkd1aWxkTW9kdWxlIiwiZ2V0UmVsYXRpb25zaGlwcyIsInNlc3Npb25Nb2R1bGUiLCJnZXRTZXNzaW9ucyIsInNpemUxNCIsImg1IiwiZ2V0UHJvZmlsZVZhbHVlIiwiZ2V0U3RhdGlzdGljcyIsImdldFNlc3Npb25WYWx1ZSIsIm1hcmdpbkJvdHRvbTIwIiwic2Vzc2lvbnNSYXciLCJzZXNzaW9ucyIsInNlc3Npb25JZCIsImNsaWVudEluZm8iLCJvcyIsImNsaWVudCIsImFjdGl2ZSIsImFjdGl2aXRpZXMiLCJyZXBlYXQiLCJjcmVhdGVkQXQiLCJhdmF0YXIiLCJnZXREYXRlIiwiZ2V0TW9udGgiLCJnZXRGdWxsWWVhciIsImdldEhvdXJzIiwiZ2V0TWludXRlcyIsImdldFNlY29uZHMiLCJmbGFncyIsImhhc1ByZW1pdW1TdWJzY3JpcHRpb24iLCJlbWFpbCIsIm1mYUVuYWJsZWQiLCJtb2JpbGUiLCJwaG9uZSIsInZlcmlmaWVkIiwicmVsYXRpb25zIiwiZnJpZW5kcyIsImlzRnJpZW5kIiwiaXNCbG9ja2VkIiwiaGlnaHRsaWdodEpTIiwiaGlnaGxpZ2h0IiwibWVzc2FnZU1vZHVsZTEiLCJtZXNzYWdlTW9kdWxlMiIsIkNvZGVDb250ZW50IiwiX19odG1sIiwibGFuZ3VhZ2UiLCJtYXJnaW5Cb3R0b204Iiwic2V0dGluZ1RpdGxlIiwiZm9ybU1vZHVsZSIsInN0YXRlcyIsIkZvcm1TZWN0aW9uIiwiYWxsQ29tcG9uZW50cyIsImNvbXAiLCJBbGxQcmV2aWV3cyIsInRhYiIsInNldFN0YXRlIiwibmV3U3RhdGUiLCJnZXRQcm9wcyIsInJlbmRlclByZXZpZXciLCJiYWNrZ3JvdW5kQ29sb3IiLCJwYWRkaW5nIiwiYm9yZGVyUmFkaXVzIiwicmVuZGVyQ29kZSIsImdlbmVyYXRlQ29kZSIsImdldFN0ckZvclByb3AiLCJjb21wUGF0aCIsImxhbmciLCJTdHJpbmciLCIkJHR5cGVvZiIsIlN5bWJvbCIsImZvciIsImNvbXBOYW1lIiwiY29tcENhdGVnb3J5IiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJjaGlsZHJlbkRhdGEiLCJtYXJnaW5Cb3R0b20iLCJyZW5kZXJzIiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJ0cnVzdGVkIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJzZXRJbW1lZGlhdGUiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bm1vdW50ZWQiLCJsaW5rcyIsImludml0ZSIsInRlc3RlciIsImRvbmF0ZSIsInBhdHJlb24iLCJhdXRob3JJZCIsImF1dGhvckxpbmsiLCJpc1NjYW5uaW5nIiwiVG9vbHRpcCIsImFzY2VuZGluZyIsImlzUGx1Z2lucyIsInJldmVyc2UiLCJvcGVuRm9sZGVyIiwic2hvdWxkRGVsZXRlIiwiY29uZmlybURlbGV0ZSIsInNvcnRPcHRpb25zIiwiZGlyZWN0aW9ucyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0QWRkb25zIiwic29ydGVkQWRkb25zIiwiYiIsImNhcCIsImZpcnN0Iiwic2Vjb25kIiwibG9jYWxlQ29tcGFyZSIsInJlZnJlc2hJY29uIiwiZm9yY2VVcGRhdGUiLCJhZGRvbkNhcmRzIiwiZmlsbFJ1bGUiLCJjbGlwUnVsZSIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsIm9wYWNpdHkiLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJwbGFjZWhvbGRlciIsIlYyQ19Db250ZW50Q29sdW1uIiwiY29udGVudE1vZHVsZSIsImNvbnRlbnRDb2x1bW4iLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiY29tcG9uZW50RGlkTW91bnQiLCJlZGl0b3IiLCJhY2UiLCJzZXRUaGVtZSIsInNlc3Npb24iLCJzZXRNb2RlIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0Rm9udFNpemUiLCJkZXN0cm95IiwicHJldlByb3BzIiwicHJldlN0YXRlIiwiZGV0YWNoZWRSb290IiwiY29kZU1pcnJvciIsImxpbmVOdW1iZXJzIiwibW9kZSIsImluZGVudFVuaXQiLCJzY3JvbGxiYXJTdHlsZSIsIl9jY3NzIiwiY2NzcyIsInVwZGF0ZUxpbmVDb3VudCIsImxpbmVDb3VudCIsIlNldHRpbmdzVGl0bGUiLCJDaGVja2JveCIsImJvcmRlclJpZ2h0IiwiYm9yZGVyTGVmdCIsImZvbnRTaXplIiwibWFyZ2luTGVmdCIsImFyZyIsImdldFZhbHVlIiwiZHJvb3QiLCJpbmplY3REZXRhY2hlZFJvb3QiLCJCREVycm9yQm91bmRhcnkiLCJoYXNFcnJvciIsImNvbXBvbmVudERpZENhdGNoIiwiRGVsZXRlIiwiRG93bkFycm93IiwiRWRpdCIsIm1hcmdpbk1vZHVsZSIsIm1hcmdpblRvcDYwIiwiVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIiwicHJldmlldyIsImlzZmV0Y2hpbmciLCJhc3NldENvbXBvbmVudHMiLCJ1cGRhdGVXaGVuRmV0Y2hlZCIsImRlZmF1bHRTZXR0aW5nIiwiUlBDUHJvcHMiLCJhc3NldCIsInVwZGF0ZVByZXZpZXciLCJvcHRpb25zQ29tcG9uZW50cyIsIm9oZ29kb2hmdWNrIiwiX29wdGlvbnNDb21wb25lbnRzIiwiYXJyYXkiLCJpbnB1dFRleHRNb2R1bGVzIiwiSW5wdXRUZXh0IiwicmVtb3ZlS2V5YmluZCIsIl9ob3Jpem9udGFsIiwiaW5wdXRNaW5pIiwic2l6ZTE2Iiwic2l6ZTIwIiwiaW5wdXQiLCJsYXN0RWRpdGVkIiwiaXNUaW1pbmciLCJyb3dNb2R1bGUiLCJmbGV4TW9kdWxlIiwiaW5wdXRNb2R1bGUiLCJzaXplTW9kdWxlMiIsInJvdyIsImZsZXhDaGlsZCIsIklucHV0TnVtYmVyTW9kdWxlcyIsIklucHV0TnVtYmVyIiwiY29sb3JUcmFuc3BhcmVudCIsInNldFZhbHVlIiwiY2xpcGJvYXJkIiwiSW5wdXRDaG9pY2VNb2R1bGVzIiwiSW5wdXRDaG9pY2UiLCJEaXZpZGVyTW9kdWxlcyIsIkRpdmlkZXIiLCJkaXZpZGVyIiwiZGl2aWRlckRlZmF1bHQiLCJEaXNjb3JkQnV0dG9uIiwiUnBjUHJldmlldyIsImNoYW5nZVRhYiIsImFuY2llbnRUYWIiLCJzZXRBY3RpdmUiLCJycGMiLCJmbGV4IiwiaXNBY3RpdmUiLCJQcm9maWxlIiwiUG9wb3V0IiwiVGFiIiwicG9wb3V0TW9kdWxlIiwidXNlclBvcG91dCIsInZlcnRpY2FsIiwiYWxpZ25TdHJldGNoIiwic3RyZWFtZXJNb2RlRW5hYmxlZEJ0biIsImFjdGl2aXR5VXNlclBvcG91dCIsIm11dGVkIiwidGhlbWVHaG9zdEhhaXJsaW5lQ2hhbm5lbHMiLCJub3RlIiwicHJvIiwiaW5saW5lIiwicm9vdE1vZHVsZTEiLCJmbGV4TW9kdWxlMSIsInN0eWxpbmdNb2R1bGUxIiwibmFtZVRhZ01vZHVsZTEiLCJhY3Rpdml0eU1vZHVsZTEiLCJ0ZXh0TW9kdWxlMSIsInNpemVNb2R1bGUxIiwic2Nyb2xsZXJNb2R1bGUxIiwibm90ZU1vZHVsZTEiLCJwcm90aXBNb2R1bGUxIiwiY29sb3JNb2R1bGUxIiwiYXZhdGFyTW9kdWxlMSIsInVzZXJNb2R1bGUxIiwiYXZhdGFyVVJMIiwiZ2V0QXZhdGFyVVJMIiwidGltZXN0YW1wQ2xhc3MiLCJpbWFnZXMiLCJhc3NldHNMYXJnZUltYWdlVXNlclBvcG91dCIsImFzc2V0c0xhcmdlTWFza1VzZXJQb3BvdXQiLCJhc3NldHNTbWFsbEltYWdlVXNlclBvcG91dCIsImhlYWRlclBsYXlpbmciLCJqdXN0aWZ5Q2VudGVyIiwiYWxpZ25DZW50ZXIiLCJub1dyYXAiLCJoZWFkZXJUb3AiLCJhdmF0YXJXcmFwcGVyTm9ybWFsIiwiYXZhdGFySGludCIsImF2YXRhckhpbnRJbm5lciIsIlZJRVdfUFJPRklMRSIsImhlYWRlclRleHQiLCJob3Jpem9udGFsIiwianVzdGlmeVN0YXJ0IiwiaGVhZGVyVGFnTm9OaWNrbmFtZSIsIm5hbWVUYWciLCJoZWFkZXJUYWdVc2VybmFtZU5vTmlja25hbWUiLCJoZWFkZXJUZXh0Tm9ybWFsIiwiVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlORyIsImJvZHlOb3JtYWwiLCJjb250ZW50SW1hZ2VzVXNlclBvcG91dCIsImNvbnRlbnROb0ltYWdlc1VzZXJQb3BvdXQiLCJuYW1lTm9ybWFsIiwiYWN0aXZpdHlOYW1lIiwidGltZUNvbXBvbmVudCIsInRpbWVzdGFtcFJlbmRlciIsIlRpbWVzdGFtcCIsImVuZCIsInNjcm9sbGVyRmFkZSIsImJvZHlJbm5lciIsImJvZHlUaXRsZSIsIk5PVEUiLCJOT1RFX1BMQUNFSE9MREVSIiwicHJvdGlwIiwiUElOTkVEX01FU1NBR0VTX1BST19USVAiLCJ0aXAiLCJDT05URVhUX01FTlVfSElOVCIsIlN0YXR1c01vZHVsZXMiLCJTdGF0dXMiLCJnZXRQcmVzZW5jZSIsIlByb2ZpbGVNb2R1bGVzIiwidG9wU2VjdGlvblN0cmVhbWluZyIsImFjdGl2aXR5UHJvZmlsZSIsImFzc2V0c0xhcmdlSW1hZ2VQcm9maWxlIiwiYXNzZXRzTGFyZ2VNYXNrUHJvZmlsZSIsImFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlIiwidG9wU2VjdGlvblBsYXlpbmciLCJoZWFkZXJJbmZvIiwicHJvZmlsZUJhZGdlcyIsImhlYWRlckZpbGwiLCJjb250ZW50SW1hZ2VzUHJvZmlsZSIsInVzZXJJbmZvU2VjdGlvbiIsInVzZXJJbmZvU2VjdGlvbkhlYWRlciIsIkNvbm5lY3RlZEFjY291bnRzIiwiYWNjb3VudHMiLCJBY2NvdW50TW9kdWxlMSIsImdldEFjY291bnRzIiwiYWNjcyIsInZpc2liaWxpdHkiLCJhY2MiLCJjb25uZWN0ZWRBY2NvdW50cyIsIkNvbm5lY3RlZEFjY291bnQiLCJmbG93ZXJNb2R1bGUxIiwiYW5jaG9yTW9kdWxlMSIsIlNvY2lhbENvbnN0YW50cyIsImNvbnN0YW50c1NvY2lhbCIsImNvbm5lY3RlZEFjY291bnQiLCJjb25uZWN0ZWRBY2NvdW50SWNvbiIsIndoaXRlIiwiZ3JleSIsImNvbm5lY3RlZEFjY291bnROYW1lSW5uZXIiLCJjb25uZWN0ZWRBY2NvdW50TmFtZSIsImNvbm5lY3RlZEFjY291bnRWZXJpZmllZEljb24iLCJjb25uZWN0ZWRBY2NvdW50T3Blbkljb24iLCJCYWRnZXMiLCJyb290TW9kdWxlIiwiVXNlckZsYWdzIiwic2VyaWFsaXplZCIsImZsYWdOYW1lIiwiaGFzRmxhZyIsInNlYXJjaGFibGUiLCJCYWRnZSIsInByb2ZpbGVCYWRnZVdyYXBwZXIiLCJwcm9maWxlQmFkZ2UiLCJWMkNfTGF5ZXIiLCJrZXl1cExpc3RlbmVyIiwidHJhbnNmb3JtIiwiY29tcG9uZW50V2lsbE1vdW50IiwiY2hhbmdlQ2F0ZWdvcnkiLCJzZWFyY2hLZXlEb3duIiwiY2hlY2tDb25uZWN0aW9uIiwiY29ubmVjdCIsIkd1aWxkU3RvcmUiLCJBdmF0YXJEZWZhdWx0cyIsIlNvcnRlZEd1aWxkU3RvcmUiLCJzZWxlY3RlZENhdGVnb3J5IiwibG9hZGluZyIsInNlcnZlcnMiLCJjb25uZWN0aW9uIiwiZmV0Y2giLCJzZXJ2ZXIiLCJqb2luZWQiLCJ0ZXJtIiwiY2F0ZWdvcnlCdXR0b25zIiwidG90YWwiLCJzYnYiLCJjb250ZW50U2Nyb2xsZXIiLCJzZXJ2ZXJDYXJkIiwicGlubmVkIiwiYWNjZXB0SW52aXRlIiwiaW52aXRlX2NvZGUiLCJqb2luRW5kUG9pbnQiLCJpZGVudGlmaWVyIiwiY3JlZGVudGlhbHMiLCJ3aW5kb3dPcHRpb25zIiwic2NyZWVuWCIsInNjcmVlblkiLCJqb2luV2luZG93IiwiQnJvd3NlcldpbmRvdyIsIndlYkNvbnRlbnRzIiwibG9hZFVSTCIsInJlc2l6YWJsZSIsIm1heGltaXphYmxlIiwibWluaW1pemFibGUiLCJhbHdheXNPblRvcCIsImNlbnRlciIsIndlYlByZWZlcmVuY2VzIiwibm9kZUludGVncmF0aW9uIiwiYmRTZXJ2ZXIiLCJvbmxpbmUiLCJtZW1iZXJzIiwiaWNvblVybCIsIm5hdGl2ZWpvaW4iLCJzZXJ2ZXIyIiwiZ3VpbGRMaXN0IiwiZ2V0RmxhdHRlbmVkR3VpbGRJZHMiLCJkZWZhdWx0TGlzdCIsIkRFRkFVTFRfQVZBVEFSUyIsIlNlcnZlckNhcmQiLCJmYWxsYmFjayIsImZsb29yIiwiY29ubmVjdEVuZFBvaW50IiwiU2lkZWJhclZpZXciLCJ0b29scyIsIlRvb2xzIiwiVGFiQmFyU2VwYXJhdG9yIiwic2VhcmNoSW5wdXQiLCJUYWJCYXJIZWFkZXIiLCJUYWJCYXJJdGVtIiwibWF4TGVuZ3RoIiwic2VhcmNoaW5wdXQiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiVjJDX1NpZGViYXJWaWV3IiwiU2Nyb2xsZXIiLCJmYWRlIiwiZGFyayIsIlYyQ19SZWxvYWRJY29uIiwieG1sbnMiLCJWMkNfU2Nyb2xsZXIiLCJzY3JvbGxlckhvcml6b250YWwiLCJzY3JvbGxlck1vZHVsZTIiLCJzaWRlYmFyUmVnaW9uU2Nyb2xsZXIiLCJ3cmFwcGVyQ2xhc3MiLCJzY3JvbGxlckNsYXNzIiwiY29udGVudFJlZ2lvblNjcm9sbGVyIiwiY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcCIsInRoZW1lR2hvc3QiLCJzY3JvbGxlclRyYWNrIiwiVjJDX1NlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJTZXR0aW5nc0dyb3VwIiwiVjJDX1NldHRpbmdzR3JvdXAiLCJidXR0b25Db21wb25lbnQiLCJWMkNfU2V0dGluZ3NUaXRsZSIsIlN3aXRjaEl0ZW0iLCJWMkNfVGFiQmFySGVhZGVyIiwiVjJDX1RhYkJhckl0ZW0iLCJWMkNfVGFiQmFyU2VwYXJhdG9yIiwiaW50ZXJ2YWxNb2R1bGUxIiwiSW50ZXJ2YWwiLCJUaW1lUmVuZGVyIiwiX2ludGVydmFsIiwiZ2V0VXBkYXRlZFRpbWUiLCJnZXREaWZmIiwiY2hlY2tVbml4IiwiaG91cnMiLCJtaW51dGVzIiwic2Vjb25kcyIsInJlbmRlclRpbWUiLCJudW1iZXIiLCJyZW1vdmVaZXJvIiwidXNlZFByb3BzIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfRU5EIiwiVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfU1RBUlQiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwiRW11bGF0ZWRUb29sdGlwIiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsInRvb2x0aXAiLCJsYWJlbEVsZW1lbnQiLCJ0b29sdGlwQ29udGVudCIsInBvaW50ZXJFbGVtZW50IiwidG9vbHRpcFBvaW50ZXIiLCJwb3BvdXRzIiwiY2FuU2hvd0Fib3ZlIiwiY2FuU2hvd0JlbG93IiwiY2FuU2hvd0xlZnQiLCJjYW5TaG93UmlnaHQiLCJfY2xhc3NOYW1lIiwic2hvd0Fib3ZlIiwic2hvd0JlbG93Iiwic2hvd0xlZnQiLCJzaG93UmlnaHQiLCJjZW50ZXJIb3Jpem9udGFsbHkiLCJjZW50ZXJWZXJ0aWNhbGx5Iiwibm9kZWNlbnRlciIsImZpbmRET01Ob2RlIiwiVjJDX1hTdmciXSwibWFwcGluZ3MiOiI7O1FBQUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7OztRQUdBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSwwQ0FBMEMsZ0NBQWdDO1FBQzFFO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0Esd0RBQXdELGtCQUFrQjtRQUMxRTtRQUNBLGlEQUFpRCxjQUFjO1FBQy9E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QUFPdnBCLG1EQUFJLENBQUNnbUIsS0FBTCxDQUFXNWxCLGFBQVgsQ0FDSCxLQURHLEVBRUg7QUFBQ214RCxXQUFLLEVBQUUsNEJBQVI7QUFBc0N6d0IsYUFBTyxFQUFFLFdBQS9DO0FBQTREcnFCLFdBQUssRUFBRTtBQUFDd1MsYUFBSyxFQUFFLE1BQVI7QUFBZ0IrTyxjQUFNLEVBQUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdIaDRCLG1EQUFJLENBQUNnbUIsS0FBTCxDQUFXNWxCLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0UsZUFBUyxFQUFFLFlBQVo7QUFBMEI0Z0MsVUFBSSxFQUFFLE1BQWhDO0FBQXdDb2MsY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSXQ5QyxtREFBSSxDQUFDZ21CLEtBQUwsQ0FBVzVsQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUN1OUIsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJMzlCLG1EQUFJLENBQUNnbUIsS0FBTCxDQUFXNWxCLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0UsZUFBUyxFQUFFLE1BQVo7QUFBb0I0Z0MsVUFBSSxFQUFFLFNBQTFCO0FBQXFDdkQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQzs7Ozs7Ozs7Ozs7QUNBQSxvQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxrQyIsImZpbGUiOiJtYWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJpbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuLy8gdmFyIHNldHRpbmdzUGFuZWwsIHZvaWNlTW9kZSwgcGx1Z2luTW9kdWxlLCB0aGVtZU1vZHVsZSwgZE1vZGUsIHB1YmxpY1NlcnZlcnNNb2R1bGUsIG1haW5Db3JlLCBCRFYyO1xyXG5leHBvcnQgY29uc3QgbWluaW11bURpc2NvcmRWZXJzaW9uID0gXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBjdXJyZW50RGlzY29yZFZlcnNpb24gPSAod2luZG93LkRpc2NvcmROYXRpdmUgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uKCkpIHx8IFwiMC4wLjMwNlwiO1xyXG5leHBvcnQgY29uc3QgbWluU3VwcG9ydGVkVmVyc2lvbiA9IFwiMC4zLjBcIjtcclxuZXhwb3J0IGNvbnN0IGJiZFZlcnNpb24gPSBcIjAuMy40XCI7XHJcbmV4cG9ydCBjb25zdCBMQ0NoYW5lbG9nID0ge1xyXG4gICAgZGVzY3JpcHRpb246IFwiTGlnaHRjb3JkJ3MgY2hhbmdlbG9nXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJXaGF0J3MgTmV3P1wiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCJMaWdodGNvcmQgaXMgbm93IGF2YWlsYWJsZSAhXCIsXHJcbiAgICAgICAgICAgICAgICBcIldlIHJlbW92ZWQgZW1vdGVzLiBUaGF0J3Mgc2FkIGZvciBwZW9wbGUgd2hvIHdlcmUgYWN0dWFsbHkgdXNpbmcgaXQsIGJ1dCBpdCB3YXMgbGVhZGluZyB0byBtb3JlIGxvYWRpbmcgdGltZSBhbmQgc29tZSBiYXNpYyB3b3JkcyB3ZXJlIGVtb3RlLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgaW1hZ2U6IFwiaHR0cHM6Ly9pLmltZ3VyLmNvbS9zZk5ocXdQLnBuZ1wiLFxyXG4gICAgdGl0bGU6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICBzdWJ0aXRsZTogXCJ2XCIrcmVtb3RlLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9uLFxyXG4gICAgZm9vdGVyOiAoZnVuY3Rpb24oKXtcclxuICAgICAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBpZighVGV4dEVsZW1lbnQgfHwgIU1vZGFsU3RhY2spcmV0dXJuIG51bGxcclxuXHJcbiAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcclxuICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xyXG4gICAgICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgQkRWMi5qb2luTEMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gQW5jaG9yID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xyXG4gICAgICAgIHJldHVybiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dEVsZW1lbnQsIHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xyXG4gICAgfSkoKVxyXG59XHJcbmV4cG9ydCBjb25zdCBiYmRDaGFuZ2Vsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJCQkQncyBjaGFuZ2Vsb2cuXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJXaGF0J3MgTmV3P1wiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCIqKkxpZ2h0Y29yZCoqIGlzIG5vdyB1c2luZyBCYW5kYWdlZEJELiBUaGF0IG1lYW5zIGFsbCBwbHVnaW5zIHlvdSB3ZXJlIHVzaW5nIGNhbiBiZSB1c2VkIHRvbyAhXCIsXHJcbiAgICAgICAgICAgICAgICBcIioqV2luZG93IFRyYW5zcGFyZW5jeSoqIGNoYW5nZXMgd2VyZSBtYWRlIHRvIG1vcmUgY29tcGF0aWJsZSB3aXRoIGV4dGVybmFsIHdpbmRvdyBtYW5hZ2VycyBhbmQgYWRkb25zIGxpa2UgR2xhc3Njb3JkLlwiLFxyXG4gICAgICAgICAgICAgICAgXCJJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBoYXMgb25jZSBhZ2FpbiBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkgdG8gaG9wZWZ1bGx5IGltcHJvdmUgbG9hZGluZyB0aW1lcy5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkJ1ZyBGaXhlc1wiLFxyXG4gICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIlNvbWUgZml4ZXMgcmVsYXRlZCB0byBzaG93aW5nIG1vZGFscyBpbiB0aGUgYEJkQXBpYC5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzID0ge1xyXG4gICAgXCJDdXN0b20gY3NzIGxpdmUgdXBkYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0wXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJCZXR0ZXJEaXNjb3JkIEJsdWVcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLWJcIiwgIGluZm86IFwiUmVwbGFjZSBEaXNjb3JkIGJsdWUgd2l0aCBCRCBCbHVlXCIsICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogZmFsc2UsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwifSxcclxuXHJcbiAgICAvKiBDb3JlICovXHJcbiAgICAvKiA9PT09PT0gKi9cclxuICAgIFwiUHVibGljIFNlcnZlcnNcIjogICAgICAgICAgICAge2lkOiBcImJkYS1ncy0xXCIsICBpbmZvOiBcIkRpc3BsYXkgcHVibGljIHNlcnZlcnMgYnV0dG9uXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIE1vZGVcIjogICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNFwiLCAgaW5mbzogXCJPbmx5IHNob3cgdm9pY2UgY2hhdFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiSGlkZSBDaGFubmVsc1wiOiAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0zXCIsICBpbmZvOiBcIkhpZGUgY2hhbm5lbHMgaW4gbWluaW1hbCBtb2RlXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIERpc2Nvbm5lY3RcIjogICAgICAgICAgIHtpZDogXCJiZGEtZGMtMFwiLCAgaW5mbzogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiMjQgSG91ciBUaW1lc3RhbXBzXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy02XCIsICBpbmZvOiBcIlJlcGxhY2UgMTJociB0aW1lc3RhbXBzIHdpdGggcHJvcGVyIG9uZXNcIiwgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk5vcm1hbGl6ZSBDbGFzc2VzXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTRcIiwgaW5mbzogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcblxyXG4gICAgLyogQ29udGVudCAqL1xyXG4gICAgXCJDb250ZW50IEVycm9yIE1vZGFsXCI6ICAgICAgICB7aWQ6IFwiZm9yay1wcy0xXCIsIGluZm86IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjYW4gUGx1Z2luc1wiOiAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTZcIiwgaW5mbzogXCJTY2FuIHBsdWdpbnMgZm9yIGFueSB0aHJlYXQgdGhhdCBjYW4gYmUgaGlkZGVuIGluc2lkZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNob3cgVG9hc3RzXCI6ICAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTJcIiwgaW5mbzogXCJTaG93cyBhIHNtYWxsIG5vdGlmaWNhdGlvbiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY3JvbGwgVG8gU2V0dGluZ3NcIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy0zXCIsIGluZm86IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJBdXRvbWF0aWMgTG9hZGluZ1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy01XCIsIGluZm86IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG5cclxuICAgIC8qIERldmVsb3BlciAqL1xyXG4gICAgXCJEZXZlbG9wZXIgTW9kZVwiOiAgICAgICAgIFx0ICB7aWQ6IFwiYmRhLWdzLThcIiwgaW5mbzogXCJEZXZlbG9wZXIgTW9kZSBUb2dnbGVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiQ29weSBTZWxlY3RvclwiOlx0XHRcdCAge2lkOiBcImZvcmstZG0tMVwiLCBpbmZvOiBcIkFkZHMgYSBcXFwiQ29weSBTZWxlY3RvclxcXCIgb3B0aW9uIHRvIGNvbnRleHQgbWVudXMgd2hlbiBkZXZlbG9wZXIgbW9kZSBpcyBhY3RpdmVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiUmVhY3QgRGV2VG9vbHNcIjpcdFx0XHQgIHtpZDogXCJyZWFjdERldlRvb2xzXCIsIGluZm86IFwiQWRkcyByZWFjdCBkZXZlbG9wZXIgdG9vbHMgdG8gdGhlIGRldnRvb2xzLiBNdXN0IGJlIGluc3RhbGxlZCBpbiBHb29nbGUgQ2hyb21lIG9uIHlvdXIgcGMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xyXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKSAoTm90IGltcGxlbWVudGVkKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQmx1ciBQZXJzb25uYWwgSW5mb3JtYXRpb25zXCI6e2lkOiBcImxpZ2h0Y29yZC02XCIsIGluZm86IFwiQmx1ciBzZW5zaXRpdmUgaW5mb3JtYXRpb25zIGxpa2UgZW1haWwsIHBheW1lbnQgaW5mb3MgYW5kIG1vcmUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzICYgTGlnaHRjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiLCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIgYW5kIHRoZSBcXFwiQXBpIENvbXBvbmVudHNcXFwiIHRhYi4gKG11c3QgcmVvcGVuIHNldHRpbmdzKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkFkIEJsb2NrXCI6ICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtNFwiLCBpbmZvOiBcIkJsb2NrIGFueSBCT1QgdGhhdCBkbXMgeW91IHdpdGggYW4gaW52aXRlIGxpbmsuIEV2ZW4gaW4gYW4gZW1iZWQuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiRW5hYmxlIExpZ2h0Y29yZCBTZXJ2ZXJzXCI6ICAge2lkOiBcImxpZ2h0Y29yZC01XCIsIGluZm86IFwiRW5hYmxlIExpZ2h0Y29yZCdzIHNlcnZlcnMuIERpc2FibGluZyB0aGlzIHdpbGwgZGlzYWJsZSBjdXN0b20gYmFkZ2VzLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkRpc2FibGUgdHlwaW5nXCI6ICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtN1wiLCBpbmZvOiBcIkRvbid0IGxldCBvdGhlciBzZWUgeW91J3JlIHR5cGluZy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG5cclxuICAgIC8qKiBMaWdodGNvcmQgV2luZG93ICovXHJcbiAgICBcIkFsd2F5cy1vbi1Ub3BcIjogICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtM1wiLCBpbmZvOiBcIkVuYWJsZSB3aW5kb3cncyBBbHdheXMtb24tVG9wIG1vZGUsIHdoZXJlIExpZ2h0Y29yZCBzdGF5cyBvbiB0b3Agb2Ygb3RoZXIgYXBwbGljYXRpb25zLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJXaW5kb3dcIn0sXHJcbiAgICBcclxuICAgIC8qKiBSaWNoUHJlc2VuY2UgKi9cclxuICAgIFwiRW5hYmxlXCI6ICAgICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCIsIGluZm86IFwiRW5hYmxlIFJpY2hQcmVzZW5jZSBiZWxvdy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJzdGF0dXNcIn1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29va2llID0ge1xyXG4gICAgXCJiZGEtZ3MtMVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtMlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTNcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtNlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTdcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy04XCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0wXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0yXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtN1wiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtYlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWRjLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWRtLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTJcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTVcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy02XCI6IHRydWUsXHJcbiAgICBcImZvcmstZXMtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1lcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstd3AtMVwiOiBmYWxzZSxcclxuICAgIFwiZm9yay13cC0yXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWJldGFcIjogdHJ1ZSxcclxuICAgIFwicmVhY3REZXZUb29sc1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTFcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0yXCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtM1wiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTRcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC01XCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC02XCI6IHRydWUsXHJcbiAgICBcImxpZ2h0Y29yZC03XCI6IGZhbHNlLFxyXG59O1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc0Nvb2tpZSA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzUlBDID0ge307XHJcbmV4cG9ydCBjb25zdCBkZWZhdWx0UlBDID0ge1xyXG4gICAgXCJuYW1lXCI6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICBcImFwcGxpY2F0aW9uX2lkXCI6IFwiNzExNDE2OTU3NzE4NzU3NDE4XCIsXHJcbiAgICBcInN0YXRlXCI6IFwiTGlnaHRjb3JkIENsaWVudFwiLFxyXG4gICAgXCJkZXRhaWxzXCI6IFwiQnJvd3NpbmcgRGlzY29yZFwiLFxyXG4gICAgXCJ0aW1lc3RhbXBzLnN0YXJ0XCI6IERhdGUubm93KCksXHJcbiAgICBcImFzc2V0cy5zbWFsbFwiOiBudWxsLFxyXG4gICAgXCJhc3NldHMubGFyZ2VcIjogXCI3MTIzMjM4MjEwMzc2ODI3OTFcIlxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgYmRwbHVnaW5FcnJvcnMgPSBbXTtcclxuZXhwb3J0IGNvbnN0IGJkdGhlbWVFcnJvcnMgPSBbXTsgLy8gZGVmaW5lIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkQ29uZmlnID0gT2JqZWN0LmNyZWF0ZShCZXR0ZXJEaXNjb3JkQ29uZmlnKTtcclxuXHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lcyA9IHt9O1xyXG5leHBvcnQgY29uc3QgYmRwbHVnaW5zID0ge307XHJcblxyXG5leHBvcnQgY29uc3QgcGx1Z2luQ29va2llID0ge307XHJcbmV4cG9ydCBjb25zdCB0aGVtZUNvb2tpZSA9IHt9OyIsImltcG9ydCBsb2NhbFN0b3JhZ2VGaXggZnJvbSBcIi4vbG9jYWxTdG9yYWdlRml4XCI7XHJcbmltcG9ydCBsb2FkaW5nSWNvbiBmcm9tIFwiLi9sb2FkaW5nSWNvblwiO1xyXG5sb2NhbFN0b3JhZ2VGaXgoKTtcclxubG9hZGluZ0ljb24oKTtcclxuXHJcbmNvbnN0IGRlcHJlY2F0ZUdsb2JhbCA9IChrZXksIHZhbHVlKSA9PiB7XHJcbiAgICAvLyB2YWx1ZSA9IHR5cGVvZih2YWx1ZSkgIT09IFwib2JqZWN0XCIgPyB2YWx1ZSA6IG5ldyBQcm94eSh2YWx1ZSwge1xyXG4gICAgLy8gICAgIGdldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgIC8vICAgICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkobW9kKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIG9ialttb2RdO1xyXG4gICAgLy8gICAgIH0sXHJcbiAgICAvLyAgICAgc2V0OiBmdW5jdGlvbihvYmosIG1vZCkge1xyXG4gICAgLy8gICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiBVdGlscy5lcnIoXCJEZXByZWNhdGVkIEdsb2JhbFwiLCBcIlRyeWluZyB0byBvdmVyd3JpdGUgZGVwcmVjYXRlZCBCRCBnbG9iYWxzXCIpO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH0pO1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywga2V5LCB7XHJcbiAgICAgICAgZ2V0KCkge1xyXG4gICAgICAgICAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgYFwiJHtrZXl9XCIgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gUGxlYXNlIG9ubHkgdXNlIEJkQXBpLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7ICBcclxufTtcclxuXHJcblxyXG5pbXBvcnQgKiBhcyBHbG9iYWxzIGZyb20gXCIuLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBnbG9iYWxLZXlzID0gT2JqZWN0LmtleXMoR2xvYmFscyk7XHJcbmZvciAoY29uc3Qga2V5IG9mIGdsb2JhbEtleXMpIGRlcHJlY2F0ZUdsb2JhbChrZXksIEdsb2JhbHNba2V5XSk7XHJcblxyXG5cclxuaW1wb3J0IEJkQXBpIGZyb20gXCIuL21vZHVsZXMvYmRBcGlcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL21vZHVsZXMvcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9tb2R1bGVzL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vbW9kdWxlcy9jbGFzc05vcm1hbGl6ZXJcIjtcclxuXHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJEVjJcIiwgQkRWMik7XHJcbmRlcHJlY2F0ZUdsb2JhbChcInBsdWdpbk1vZHVsZVwiLCBwbHVnaW5Nb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJ0aGVtZU1vZHVsZVwiLCB0aGVtZU1vZHVsZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIlV0aWxzXCIsIFV0aWxzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQkRFdmVudHNcIiwgQkRFdmVudHMpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJzZXR0aW5nc1BhbmVsXCIsIHNldHRpbmdzUGFuZWwpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJEYXRhU3RvcmVcIiwgRGF0YVN0b3JlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ29udGVudE1hbmFnZXJcIiwgQ29udGVudE1hbmFnZXIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJDbGFzc05vcm1hbGl6ZXJcIiwgQ2xhc3NOb3JtYWxpemVyKTtcclxuXHJcbndpbmRvdy5CZEFwaSA9IEJkQXBpO1xyXG5cclxuaW1wb3J0IENvcmUgZnJvbSBcIi4vbW9kdWxlcy9jb3JlXCI7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIENvcmUpO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb3JlV3JhcHBlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihiZENvbmZpZykge1xyXG4gICAgICAgIENvcmUuc2V0Q29uZmlnKGJkQ29uZmlnKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xyXG4gICAgICAgIENvcmUuaW5pdCgpO1xyXG4gICAgfVxyXG59XHJcblxyXG4vLyBmdW5jdGlvbiBwYXRjaE1vZHVsZUxvYWQoKSB7XHJcbi8vICAgICBjb25zdCBuYW1lc3BhY2UgPSBcImJldHRlcmRpc2NvcmRcIjtcclxuLy8gICAgIGNvbnN0IHByZWZpeCA9IGAke25hbWVzcGFjZX0vYDtcclxuLy8gICAgIGNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIik7XHJcbi8vICAgICBjb25zdCBsb2FkID0gTW9kdWxlLl9sb2FkO1xyXG4vLyAgICAgLy8gY29uc3QgcmVzb2x2ZUZpbGVuYW1lID0gTW9kdWxlLl9yZXNvbHZlRmlsZW5hbWU7XHJcblxyXG4vLyAgICAgTW9kdWxlLl9sb2FkID0gZnVuY3Rpb24ocmVxdWVzdCkge1xyXG4vLyAgICAgICAgIGlmIChyZXF1ZXN0ID09PSBuYW1lc3BhY2UgfHwgcmVxdWVzdC5zdGFydHNXaXRoKHByZWZpeCkpIHtcclxuLy8gICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVkID0gcmVxdWVzdC5zdWJzdHIocHJlZml4Lmxlbmd0aCk7XHJcbi8vICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWQgPT0gXCJhcGlcIikgcmV0dXJuIEJkQXBpO1xyXG4vLyAgICAgICAgIH1cclxuXHJcbi8vICAgICAgICAgcmV0dXJuIGxvYWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuLy8gICAgIH07XHJcblxyXG4vLyAgICAgLy8gTW9kdWxlLl9yZXNvbHZlRmlsZW5hbWUgPSBmdW5jdGlvbiAocmVxdWVzdCwgcGFyZW50LCBpc01haW4pIHtcclxuLy8gICAgIC8vICAgICBpZiAocmVxdWVzdCA9PT0gXCJiZXR0ZXJkaXNjb3JkXCIgfHwgcmVxdWVzdC5zdGFydHNXaXRoKFwiYmV0dGVyZGlzY29yZC9cIikpIHtcclxuLy8gICAgIC8vICAgICAgICAgY29uc3QgY29udGVudFBhdGggPSBQbHVnaW5NYW5hZ2VyLmdldFBsdWdpblBhdGhCeU1vZHVsZShwYXJlbnQpO1xyXG4vLyAgICAgLy8gICAgICAgICBpZiAoY29udGVudFBhdGgpIHJldHVybiByZXF1ZXN0O1xyXG4vLyAgICAgLy8gICAgIH1cclxuXHJcbi8vICAgICAvLyAgICAgcmV0dXJuIHJlc29sdmVGaWxlbmFtZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG4vLyAgICAgLy8gfTtcclxuXHJcbi8vICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XHJcbi8vICAgICAgICAgTW9kdWxlLl9sb2FkID0gbG9hZDtcclxuLy8gICAgIH07XHJcbi8vIH1cclxuXHJcbi8vIHBhdGNoTW9kdWxlTG9hZCgpO1xyXG5cclxuLy8gdmFyIHNldHRpbmdzUGFuZWwsIHZvaWNlTW9kZSwsIGRNb2RlLCBwdWJsaWNTZXJ2ZXJzTW9kdWxlO1xyXG4vLyB2YXIgYmRDb25maWcgPSBudWxsO1xyXG5cclxucmVxdWlyZShcInJlcXVlc3RcIikvLyBqdXN0IGluIGNhY2hlIHNvIHBsdWdpbiBjYW4gcmVxdWlyZSBpdCB0b28iLCJleHBvcnQgZGVmYXVsdCAoKSA9PiB7XHJcbiAgICBjb25zdCB2MkxvYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICB2MkxvYWRlci5jbGFzc05hbWUgPSBcImJkLWxvYWRlcnYyXCI7XHJcbiAgICB2MkxvYWRlci50aXRsZSA9IFwiQmFuZGFnZWRCRCBpcyBsb2FkaW5nLi4uXCI7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHYyTG9hZGVyKTtcclxufTsiLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGNvbnRlbnRXaW5kb3dHZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgXCJjb250ZW50V2luZG93XCIpLmdldDtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiLCB7XHJcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRXaW5kb3cgPSBSZWZsZWN0LmFwcGx5KGNvbnRlbnRXaW5kb3dHZXR0ZXIsIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJveHkoY29udGVudFdpbmRvdywge1xyXG4gICAgICAgICAgICAgICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJsb2NhbFN0b3JhZ2VcIikgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IG9ialtwcm9wXTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsLmJpbmQob2JqKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBQcmV2ZW50IGludGVyY2VwdGlvbiBieSBwYXRjaGluZyBSZWZsZWN0LmFwcGx5IGFuZCBGdW5jdGlvbi5wcm90b3R5cGUuYmluZFxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlZmxlY3QsIFwiYXBwbHlcIiwge3ZhbHVlOiBSZWZsZWN0LmFwcGx5LCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdW5jdGlvbi5wcm90b3R5cGUsIFwiYmluZFwiLCB7dmFsdWU6IEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCB3cml0YWJsZTogZmFsc2UsIGNvbmZpZ3VyYWJsZTogZmFsc2V9KTtcclxuXHJcbiAgICBjb25zdCBvT3BlbiA9IFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuO1xyXG4gICAgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9wZW4gPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBjb25zdCB1cmwgPSBhcmd1bWVudHNbMV07XHJcbiAgICAgICAgaWYgKHVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKFwiYXBpL3dlYmhvb2tzXCIpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShvT3BlbiwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgIH07XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVEZIb3VyIHtcclxuICAgIGluamVjdDI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHJldHVybjtcclxuXHJcbiAgICAgICAgY29uc3QgdHdlbHZlSG91ciA9IG5ldyBSZWdFeHAoYChbMC05XXsxLDJ9KTooWzAtOV17MSwyfSlcXFxccyhBTXxQTSlgKTtcclxuICAgICAgICBjb25zdCBjb252ZXJ0ID0gKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWQgPSBkYXRhLnJldHVyblZhbHVlLm1hdGNoKHR3ZWx2ZUhvdXIpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdGNoZWQgfHwgbWF0Y2hlZC5sZW5ndGggIT09IDQpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKG1hdGNoZWRbM10gPT09IFwiQU1cIikgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIwMFwiIDogbWF0Y2hlZFsxXS5wYWRTdGFydCgyLCBcIjBcIil9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLnJldHVyblZhbHVlLnJlcGxhY2UobWF0Y2hlZFswXSwgYCR7bWF0Y2hlZFsxXSA9PT0gXCIxMlwiID8gXCIxMlwiIDogcGFyc2VJbnQobWF0Y2hlZFsxXSkgKyAxMn06JHttYXRjaGVkWzJdfWApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IGNhbmNlbENvenkgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLlRpbWVGb3JtYXR0ZXIsIFwiY2FsZW5kYXJGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb3p5IG1vZGVcclxuICAgICAgICBjb25zdCBjYW5jZWxDb21wYWN0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImRhdGVGb3JtYXRcIiwge2FmdGVyOiBjb252ZXJ0fSk7IC8vIENhbGxlZCBpbiBDb21wYWN0IG1vZGVcclxuICAgICAgICB0aGlzLmNhbmNlbDI0SG91ciA9ICgpID0+IHtjYW5jZWxDb3p5KCk7IGNhbmNlbENvbXBhY3QoKTt9OyAvLyBDYW5jZWwgYm90aFxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZTI0SG91cigpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWwyNEhvdXIpIHRoaXMuY2FuY2VsMjRIb3VyKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCJcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmRpc3BhdGNoZXJcclxuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWwgJiYgZS5kZWZhdWx0Lmhhc0NoYW5uZWwpWzBdLmRlZmF1bHRcclxubGV0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxubGV0IERNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuXHJcbmNvbnN0IGJsb2NrZWQgPSB7fVxyXG5cclxubGV0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF1cclxuZnVuY3Rpb24gZ2V0Q3VycmVudFVzZXIoKXtcclxuICAgIGlmKHVzZXJNb2R1bGUpcmV0dXJuIHVzZXJNb2R1bGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcigpXHJcbiAgICByZXR1cm4gbnVsbFxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQW50aUJvdERNIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5hbnRpRE0gPSB0aGlzLmFudGlETS5iaW5kKHRoaXMpXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShcIk1FU1NBR0VfQ1JFQVRFXCIsIHRoaXMuYW50aURNKVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcblxyXG4gICAgICAgIGRpc3BhdGNoZXIudW5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBhbnRpRE0oZXYpe1xyXG4gICAgICAgIGlmKCFldi5tZXNzYWdlLmF1dGhvci5ib3QpcmV0dXJuXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5hdXRob3IuaWQgPT09IGdldEN1cnJlbnRVc2VyKCkuaWQpXHJcbiAgICAgICAgaWYoZXYubWVzc2FnZS5ndWlsZF9pZClyZXR1cm5cclxuXHJcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbChldi5tZXNzYWdlLmNoYW5uZWxfaWQpXHJcbiAgICAgICAgaWYoIWNoYW5uZWwpcmV0dXJuIC8vIG1pZ2h0IGJlIGJyb2tlblxyXG5cclxuICAgICAgICBpZihjaGFubmVsLnR5cGUgIT09IDEpcmV0dXJuXHJcblxyXG4gICAgICAgIGlmKGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdKXJldHVybiAvLyBJZiB0aGUgdXNlciB1bmJsb2NrIHRoZSBib3QsIERvbid0IGJsb2NrIGl0IGFnYWluLlxyXG5cclxuICAgICAgICBpZihzY2FuTWVzc2FnZShldi5tZXNzYWdlKSl7XHJcbiAgICAgICAgICAgIGJsb2NrZWRbZXYubWVzc2FnZS5hdXRob3IuaWRdID0gdHJ1ZVxyXG4gICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoYFtBZEJsb2NrXTogQmxvY2tlZCAke2V2Lm1lc3NhZ2UuYXV0aG9yLnVzZXJuYW1lfSMke2V2Lm1lc3NhZ2UuYXV0aG9yLmRpc2NyaW1pbmF0b3J9YCwge1xyXG4gICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwid2FybmluZ1wiXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKCFyZWxhdGlvblNoaXBNb2R1bGUpcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKVswXVxyXG4gICAgICAgICAgICByZWxhdGlvblNoaXBNb2R1bGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXAoZXYubWVzc2FnZS5hdXRob3IuaWQsIHtcclxuICAgICAgICAgICAgICAgIGxvY2F0aW9uOiBcIkNvbnRleHRNZW51XCJcclxuICAgICAgICAgICAgfSwgMilcclxuICAgICAgICAgICAgaWYoIURNTW9kdWxlKURNTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbClbMF1cclxuICAgICAgICAgICAgRE1Nb2R1bGUuZGVmYXVsdC5jbG9zZVByaXZhdGVDaGFubmVsKGNoYW5uZWwuaWQsIGZhbHNlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gc2Nhbk1lc3NhZ2UobWVzc2FnZSl7XHJcbiAgICBpZigvKGRpc2NvcmRcXC5nZ3xkaXNjb3JkXFwuY29tXFwvaW52aXRlXFwvfGRpc2NvcmRhcHBcXC5jb21cXC9pbnZpdGVcXC8pL2cudGVzdChtZXNzYWdlLmNvbnRlbnQpKXJldHVybiB0cnVlXHJcbiAgICBpZihFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuZ2cvXCIpIHx8IEVtYmVkc0NvbnRhaW5zKG1lc3NhZ2UsIFwiZGlzY29yZC5jb20vaW52aXRlL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmRhcHAuY29tL2ludml0ZS9cIikpcmV0dXJuIHRydWVcclxuXHJcbiAgICByZXR1cm4gZmFsc2VcclxufVxyXG5mdW5jdGlvbiBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBzZWFyY2gpe1xyXG4gICAgbGV0IGVtYmVkcyA9IG1lc3NhZ2UuZW1iZWRzXHJcbiAgICBpZihlbWJlZHMubGVuZ3RoID09PSAwKXJldHVybiBmYWxzZVxyXG4gICAgcmV0dXJuIGVtYmVkcy5tYXAoZW1iZWQgPT4ge1xyXG4gICAgICAgIGlmKGVtYmVkLnR5cGUgIT09IFwicmljaFwiKXJldHVybiBmYWxzZVxyXG4gICAgICAgIGlmKChlbWJlZC50aXRsZSB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKGVtYmVkLmRlc2NyaXB0aW9uIHx8IFwiXCIpLmluY2x1ZGVzKHNlYXJjaCkpcmV0dXJuIHRydWVcclxuICAgICAgICBpZigoKGVtYmVkLmZvb3RlciB8fCBcIlwiKSAmJiBlbWJlZC5mb290ZXIudGV4dCB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoZW1iZWQuZmllbGRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuaW5jbHVkZXMoc2VhcmNoKSB8fCBlLm5hbWUuaW5jbHVkZXMoc2VhcmNoKVxyXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcclxufSIsImltcG9ydCB7c2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxyXG5jb25zdCBBY3Rpb25UeXBlcyA9IEJETW9kdWxlcy5nZXQobT0+bS5BY3Rpb25UeXBlcylbMF0uQWN0aW9uVHlwZXNcclxuXHJcbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcclxuY29uc3QgcGlkID0gcHJvY2Vzcy5waWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBzZXR0aW5nc1JQQ1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgZm9ybWF0ZWRHYW1lKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcclxuICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnYW1lXHJcbiAgICB9XHJcblxyXG4gICAgc2VuZEdhbWUoKXtcclxuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuTE9DQUxfQUNUSVZJVFlfVVBEQVRFLFxyXG4gICAgICAgICAgICBzb2NrZXRJZCxcclxuICAgICAgICAgICAgcGlkLFxyXG4gICAgICAgICAgICBhY3Rpdml0eTogdGhpcy5mb3JtYXRlZEdhbWVcclxuICAgICAgICB9KSAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRW5hYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNldChzZXR0aW5nc1JQQyB8fCBPYmplY3QuY3JlYXRlKGRlZmF1bHRSUEMpKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZldGNoQXNzZXRzKGFwcGxpY2F0aW9uSWQpe1xyXG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxyXG4gICAgICAgIGlmKGFzc2V0cy51bmRlZmluZWQgJiYgdHlwZW9mIGFzc2V0cy51bmRlZmluZWQgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEFwcGxpY2F0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NldHNcclxuICAgIH1cclxuXHJcbiAgICBzZXQoYWN0aXZpdHkpe1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGFjdGl2aXR5XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIHt9fSwgLy8gZGVwcmVjYXRlZCwgZGVsZXRlZCBhbGwgZW1vdGVzIGZyb20gYmV0dGVyZGlzY29yZC5cclxuICAgIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH0sXHJcbiAgICBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XHJcbn07XHJcblxyXG5CZEFwaS5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcclxuICAgIHJldHVybiBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKGtleSwgdmFsdWUpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmluamVjdENTUyA9IGZ1bmN0aW9uIChpZCwgY3NzKSB7XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSwgY3NzKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS5jbGVhckNTUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9JbmplY3QgQ1NTIHRvIGRvY3VtZW50IGhlYWRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuLy9jc3MgPSBjdXN0b20gY3NzXHJcbkJkQXBpLmxpbmtKUyA9IGZ1bmN0aW9uIChpZCwgdXJsKSB7XHJcbiAgICBET00uYWRkU2NyaXB0KERPTS5lc2NhcGVJRChpZCksIHVybCk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkudW5saW5rSlMgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0dldCBhbm90aGVyIHBsdWdpblxyXG4vL25hbWUgPSBuYW1lIG9mIHBsdWdpblxyXG5CZEFwaS5nZXRQbHVnaW4gPSBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgaWYgKGJkcGx1Z2lucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBiZHBsdWdpbnNbbmFtZV0ucGx1Z2luO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG4vL0dldCBCZXR0ZXJEaXNjb3JkIENvcmVcclxuQmRBcGkuZ2V0Q29yZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIFV0aWxzLndhcm4oXCJEZXByZWNhdGlvbiBOb3RpY2VcIiwgYEJkQXBpLmdldENvcmUoKSB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLmApO1xyXG4gICAgcmV0dXJuIG1haW5Db3JlO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgbW9kYWwuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCAtIGEgc3RyaW5nIG9mIHRleHQgdG8gZGlzcGxheSBpbiB0aGUgbW9kYWxcclxuICovXHJcbkJkQXBpLmFsZXJ0ID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCB7Y2FuY2VsVGV4dDogbnVsbH0pO1xyXG59O1xyXG5cclxuLyoqXHJcbiAqIFNob3dzIGEgZ2VuZXJpYyBidXQgdmVyeSBjdXN0b21pemFibGUgY29uZmlybWF0aW9uIG1vZGFsIHdpdGggb3B0aW9uYWwgY29uZmlybSBhbmQgY2FuY2VsIGNhbGxiYWNrcy5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXSAtIG9wdGlvbnMgdG8gbW9kaWZ5IHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNhbmNlbFRleHQ9Q2FuY2VsXSAtIHRleHQgZm9yIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5rZXldIC0ga2V5IHVzZWQgdG8gaWRlbnRpZnkgdGhlIG1vZGFsLiBJZiBub3QgcHJvdmlkZWQsIG9uZSBpcyBnZW5lcmF0ZWQgYW5kIHJldHVybmVkXHJcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vL1Nob3cgdG9hc3QgYWxlcnRcclxuQmRBcGkuc2hvd1RvYXN0ID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICBVdGlscy5zaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZSA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRBbGxNb2R1bGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQWxsKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvcHMgPSBmdW5jdGlvbiguLi5wcm9wcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhwcm9wcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm90b3R5cGVzID0gZnVuY3Rpb24oLi4ucHJvdG9zKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlQcm90b3R5cGVzKHByb3Rvcyk7XHJcbn07XHJcblxyXG5CZEFwaS5maW5kTW9kdWxlQnlEaXNwbGF5TmFtZSA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKG5hbWUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyByZWFjdCBpbnN0YW5jZVxyXG5CZEFwaS5nZXRJbnRlcm5hbEluc3RhbmNlID0gZnVuY3Rpb24obm9kZSkge1xyXG4gICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIHdpbmRvdy5qUXVlcnkpICYmICEobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkpIG5vZGUgPSBub2RlWzBdO1xyXG4gICAgcmV0dXJuIEJEVjIuZ2V0SW50ZXJuYWxJbnN0YW5jZShub2RlKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5sb2FkRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5nZXREYXRhID0gQmRBcGkubG9hZERhdGE7XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2F2ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuc2V0RGF0YSA9IEJkQXBpLnNhdmVEYXRhO1xyXG5cclxuLy8gRGVsZXRlcyBkYXRhXHJcbkJkQXBpLmRlbGV0ZURhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuLy8gUGF0Y2hlcyBvdGhlciBmdW5jdGlvbnNcclxuQmRBcGkubW9ua2V5UGF0Y2ggPSBmdW5jdGlvbih3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICByZXR1cm4gVXRpbHMubW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucyk7XHJcbn07XHJcblxyXG4vLyBFdmVudCB3aGVuIGVsZW1lbnQgaXMgcmVtb3ZlZFxyXG5CZEFwaS5vblJlbW92ZWQgPSBmdW5jdGlvbihub2RlLCBjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm9uUmVtb3ZlZChub2RlLCBjYWxsYmFjayk7XHJcbn07XHJcblxyXG4vLyBXcmFwcyBmdW5jdGlvbiBpbiB0cnkuLmNhdGNoXHJcbkJkQXBpLnN1cHByZXNzRXJyb3JzID0gZnVuY3Rpb24obWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKTtcclxufTtcclxuXHJcbi8vIFRlc3RzIGZvciB2YWxpZCBKU09OXHJcbkJkQXBpLnRlc3RKU09OID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnRlc3RKU09OKGRhdGEpO1xyXG59O1xyXG5cclxuQmRBcGkuaXNQbHVnaW5FbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhcGx1Z2luQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNUaGVtZUVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISF0aGVtZUNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzU2V0dGluZ0VuYWJsZWQgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuICEhc2V0dGluZ3NDb29raWVbaWRdO1xyXG59O1xyXG5cclxuQmRBcGkuZW5hYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgdHJ1ZSk7XHJcbn07XHJcblxyXG5CZEFwaS5kaXNhYmxlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgZmFsc2UpO1xyXG59O1xyXG5cclxuQmRBcGkudG9nZ2xlU2V0dGluZyA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gc2V0dGluZ3NQYW5lbC5vbkNoYW5nZShpZCwgIXNldHRpbmdzQ29va2llW2lkXSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkuZ2V0QkREYXRhID0gZnVuY3Rpb24oa2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldEJERGF0YShrZXkpO1xyXG59O1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNldEJERGF0YSA9IGZ1bmN0aW9uKGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRCRERhdGEoa2V5LCBkYXRhKTtcclxufTtcclxuXHJcblxyXG5cclxuY29uc3QgbWFrZUFkZG9uQVBJID0gKGNvb2tpZSwgbGlzdCwgbWFuYWdlcikgPT4gbmV3IGNsYXNzIEFkZG9uQVBJIHtcclxuXHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBtYW5hZ2VyLmZvbGRlcjt9XHJcblxyXG4gICAgaXNFbmFibGVkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gISFjb29raWVbbmFtZV07XHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZGlzYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICB0b2dnbGUobmFtZSkge1xyXG4gICAgICAgIGlmIChjb29raWVbbmFtZV0pIHRoaXMuZGlzYWJsZShuYW1lKTtcclxuICAgICAgICBlbHNlIHRoaXMuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbG9hZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIucmVsb2FkKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldChuYW1lKSB7XHJcbiAgICAgICAgaWYgKGxpc3QuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICAgICAgaWYgKGxpc3RbbmFtZV0ucGx1Z2luKSByZXR1cm4gbGlzdFtuYW1lXS5wbHVnaW47XHJcbiAgICAgICAgICAgIHJldHVybiBsaXN0W25hbWVdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBbGwoKSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGxpc3QpLm1hcChrID0+IHRoaXMuZ2V0KGspKS5maWx0ZXIoYSA9PiBhKTtcclxuICAgIH1cclxufTtcclxuXHJcbkJkQXBpLlBsdWdpbnMgPSBtYWtlQWRkb25BUEkocGx1Z2luQ29va2llLCBiZHBsdWdpbnMsIHBsdWdpbk1vZHVsZSk7XHJcbkJkQXBpLlRoZW1lcyA9IG1ha2VBZGRvbkFQSSh0aGVtZUNvb2tpZSwgYmR0aGVtZXMsIHRoZW1lTW9kdWxlKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IEJkQXBpO1xyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJkQXBpID0gQmRBcGkiLCIvKiBCREV2ZW50cyAqL1xyXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlcigpXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkJERXZlbnRzID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXS51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzWzBdfSwgJHtzZWxlY3RvcnNbMV19LCAke3NlbGVjdG9yc1syXX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzWzBdfTpob3ZlciwgJHtzZWxlY3RvcnNbMV19OmhvdmVyLCAke3NlbGVjdG9yc1syXX06aG92ZXIge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5CREV2ZW50cyA9IHRoaXNcclxuICAgIH1cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIiNcIikgJiYgKHZhbHVlLmxlbmd0aCA9PSA3IHx8IHZhbHVlLmxlbmd0aCA9PSA0KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobW9kdWxlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLmxlbmd0aCB8fCBtYXRjaC5sZW5ndGggPCAyKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGV2ZXIgaGFwcGVuIHNpbmNlIHRoZXkgcGFzc2VkIHRoZSBtb2R1bGVGaWx0ZXIsIGJ1dCB5b3UgbmV2ZXIga25vd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHJpbmcgKz0gYCAke25vcm1hbENsYXNzfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IGNsYXNzZXMubGVuZ3RoOyBjIDwgY2xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBtYXRjaC5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHRoaXMubm9ybWFsaXplRWxlbWVudChjaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJ0RWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcclxuICAgICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi50b1JlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hET01NZXRob2RzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgdG9rZW5zID0gdG9rZW4uc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHJlbW92ZSwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29sb3JlZFRleHQge1xyXG4gICAgaW5qZWN0Q29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcclxuICAgICAgICBpZiAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgaWYgKCFwcm9wcyB8fCAhcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VDb250ZW50LnR5cGUgfHwgIW1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSB8fCBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuZGlzcGxheU5hbWUgIT0gXCJNZXNzYWdlQ29udGVudFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVHlwZS5fX29yaWdpbmFsTWV0aG9kKSByZXR1cm47IC8vIERvbid0IHBhdGNoIGFnYWluXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSA9IGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlQ29sb3IgPSBzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdID8gcHJvcHMubWVzc2FnZS5jb2xvclN0cmluZyB8fCBcIlwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLnN0eWxlID0ge2NvbG9yOiByb2xlQ29sb3J9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLCBvcmlnaW5hbFR5cGUpO1xyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK2NsYXNzTmFtZU1hcmt1cC5zcGxpdChcIiBcIilbMF0pLmZvckVhY2goZWxlbSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW0uc3R5bGUuc2V0UHJvcGVydHkoXCJjb2xvclwiLCBcIlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge2JkQ29uZmlnLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgcGx1Z2luQ2VydGlmaWVyLCB7IGVuY3J5cHRTZXR0aW5nc0NhY2hlLCBkZWNyeXB0U2V0dGluZ3NDYWNoZSwgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IHsgY2FwdHVyZVJlamVjdGlvblN5bWJvbCB9IGZyb20gXCJldmVudHNcIjtcclxuXHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIikuTW9kdWxlO1xyXG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUocmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHAuZ2V0QXBwUGF0aCgpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XHJcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xyXG5jb25zdCBvcmlnaW5hbENTU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID8gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA6ICgpID0+IHtyZXR1cm4gbnVsbDt9O1xyXG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xyXG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xyXG5cclxuZXhwb3J0IGxldCBhZGRvbkNhY2hlID0ge31cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInRoZW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwbHVnaW5zRm9sZGVyKCkge3JldHVybiB0aGlzLl9wbHVnaW5zRm9sZGVyIHx8ICh0aGlzLl9wbHVnaW5zRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwicGx1Z2lucy9cIikpKTt9XHJcbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XHJcblxyXG4gICAgbG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKXtcclxuICAgICAgICBpZih0eXBlb2YgZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSAhPT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IEpTT04ucGFyc2UoZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiKSkpXHJcbiAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJQbHVnaW5DZXJ0aWZpZXJIYXNoZXNcIiwgZW5jcnlwdFNldHRpbmdzQ2FjaGUoXCJ7fVwiKSlcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGUgPSB7fVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIE9iamVjdC5rZXlzKGFkZG9uQ2FjaGUpXHJcbiAgICAgICAgLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgIGlmKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuXHJcbiAgICAgICAgICAgIGxldCBwcm9wcyA9IFt7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwidGltZXN0YW1wXCIsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiBcIm51bWJlclwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJyZXN1bHRcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcImhhc2hcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCJcclxuICAgICAgICAgICAgfV1cclxuICAgICAgICAgICAgZm9yKGxldCBwcm9wIG9mIHByb3BzKXtcclxuICAgICAgICAgICAgICAgIGlmKCEocHJvcC5rZXkgaW4gdmFsdWUpIHx8IHR5cGVvZiB2YWx1ZVtwcm9wLmtleV0gIT09IHByb3AudHlwZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZhbHVlLmhhc2ggIT09IGtleSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUFkZG9uQ2FjaGUoKXtcclxuICAgICAgICBkYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIsIGVuY3J5cHRTZXR0aW5nc0NhY2hlKEpTT04uc3RyaW5naWZ5KGFkZG9uQ2FjaGUpKSlcclxuICAgIH1cclxuXHJcbiAgICB3YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAodGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0pIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IGNvbnRlbnRUeXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0gPSBmcy53YXRjaChiYXNlRm9sZGVyLCB7cGVyc2lzdGVudDogZmFsc2V9LCBhc3luYyAoZXZlbnRUeXBlLCBmaWxlbmFtZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWV2ZW50VHlwZSB8fCAhZmlsZW5hbWUgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCA1MCkpO1xyXG4gICAgICAgICAgICB0cnkge2ZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5jb2RlICE9PSBcIkVOT0VOVFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSByZXR1cm4gcGx1Z2luTW9kdWxlLnVubG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhlbWVNb2R1bGUudW5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICAgICAgaWYgKCFzdGF0cyB8fCAhc3RhdHMubXRpbWUgfHwgIXN0YXRzLm10aW1lLmdldFRpbWUoKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKHN0YXRzLm10aW1lLmdldFRpbWUoKSkgIT09IFwibnVtYmVyXCIpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9PSBzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy50aW1lQ2FjaGVbZmlsZW5hbWVdID0gc3RhdHMubXRpbWUuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwicmVuYW1lXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChldmVudFR5cGUgPT0gXCJjaGFuZ2VcIikge1xyXG4gICAgICAgICAgICAgICAgaWYgKGlzUGx1Z2luKSBhd2FpdCBwbHVnaW5Nb2R1bGUucmVsb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUucmVsb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdW53YXRjaENvbnRlbnQoY29udGVudFR5cGUpIHtcclxuICAgICAgICBpZiAoIXRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV0uY2xvc2UoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy53YXRjaGVyc1tjb250ZW50VHlwZV07XHJcbiAgICB9XHJcblxyXG4gICAgZXh0cmFjdE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TGluZSA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIilbMF07XHJcbiAgICAgICAgY29uc3QgaGFzT2xkTWV0YSA9IGZpcnN0TGluZS5pbmNsdWRlcyhcIi8vTUVUQVwiKTtcclxuICAgICAgICBpZiAoaGFzT2xkTWV0YSkgcmV0dXJuIHRoaXMucGFyc2VPbGRNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgIGNvbnN0IGhhc05ld01ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvKipcIik7XHJcbiAgICAgICAgaWYgKGhhc05ld01ldGEpIHJldHVybiB0aGlzLnBhcnNlTmV3TWV0YShjb250ZW50KTtcclxuICAgICAgICB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU9sZE1ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IG1ldGEgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IHJhd01ldGEgPSBtZXRhLnN1YnN0cmluZyhtZXRhLmxhc3RJbmRleE9mKFwiLy9NRVRBXCIpICsgNiwgbWV0YS5sYXN0SW5kZXhPZihcIiovL1wiKSk7XHJcbiAgICAgICAgaWYgKG1ldGEuaW5kZXhPZihcIk1FVEFcIikgPCAwKSB0aHJvdyBuZXcgTWV0YUVycm9yKFwiTUVUQSB3YXMgbm90IGZvdW5kLlwiKTtcclxuICAgICAgICBjb25zdCBwYXJzZWQgPSBVdGlscy50ZXN0SlNPTihyYXdNZXRhKTtcclxuICAgICAgICBpZiAoIXBhcnNlZCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgY291bGQgbm90IGJlIHBhcnNlZC5cIik7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQubmFtZSkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgbWlzc2luZyBuYW1lIGRhdGEuXCIpO1xyXG4gICAgICAgIHBhcnNlZC5mb3JtYXQgPSBcImpzb25cIjtcclxuICAgICAgICByZXR1cm4gcGFyc2VkO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlTmV3TWV0YShjb250ZW50KSB7XHJcbiAgICAgICAgY29uc3QgYmxvY2sgPSBjb250ZW50LnNwbGl0KFwiLyoqXCIsIDIpWzFdLnNwbGl0KFwiKi9cIiwgMSlbMF07XHJcbiAgICAgICAgY29uc3Qgb3V0ID0ge307XHJcbiAgICAgICAgbGV0IGZpZWxkID0gXCJcIjtcclxuICAgICAgICBsZXQgYWNjdW0gPSBcIlwiO1xyXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiBibG9jay5zcGxpdChzcGxpdFJlZ2V4KSkge1xyXG4gICAgICAgICAgICBpZiAobGluZS5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAobGluZS5jaGFyQXQoMCkgPT09IFwiQFwiICYmIGxpbmUuY2hhckF0KDEpICE9PSBcIiBcIikge1xyXG4gICAgICAgICAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbCA9IGxpbmUuaW5kZXhPZihcIiBcIik7XHJcbiAgICAgICAgICAgICAgICBmaWVsZCA9IGxpbmUuc3Vic3RyKDEsIGwgLSAxKTtcclxuICAgICAgICAgICAgICAgIGFjY3VtID0gbGluZS5zdWJzdHIobCArIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWNjdW0gKz0gXCIgXCIgKyBsaW5lLnJlcGxhY2UoXCJcXFxcblwiLCBcIlxcblwiKS5yZXBsYWNlKGVzY2FwZWRBdFJlZ2V4LCBcIkBcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgb3V0W2ZpZWxkXSA9IGFjY3VtLnRyaW0oKTtcclxuICAgICAgICBkZWxldGUgb3V0W1wiXCJdO1xyXG4gICAgICAgIG91dC5mb3JtYXQgPSBcImpzZG9jXCI7XHJcbiAgICAgICAgcmV0dXJuIG91dDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb250ZW50UmVxdWlyZSh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVxdWlyZSA9IGlzUGx1Z2luID8gb3JpZ2luYWxKU1JlcXVpcmUgOiBvcmlnaW5hbENTU1JlcXVpcmU7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG1vZHVsZSwgZmlsZW5hbWUpIHtcclxuICAgICAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gc2VsZi5wbHVnaW5zRm9sZGVyIDogc2VsZi50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgICAgIGNvbnN0IHBvc3NpYmxlUGF0aCA9IHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhwb3NzaWJsZVBhdGgpIHx8IGZpbGVuYW1lICE9PSBmcy5yZWFscGF0aFN5bmMocG9zc2libGVQYXRoKSkgcmV0dXJuIFJlZmxlY3QuYXBwbHkob3JpZ2luYWxSZXF1aXJlLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICBsZXQgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlbmFtZSwgXCJ1dGY4XCIpO1xyXG4gICAgICAgICAgICBjb250ZW50ID0gVXRpbHMuc3RyaXBCT00oY29udGVudCk7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgY29uc3QgbWV0YSA9IHNlbGYuZXh0cmFjdE1ldGEoY29udGVudCk7XHJcbiAgICAgICAgICAgIG1ldGEuZmlsZW5hbWUgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgbWV0YS5hZGRlZCA9IHN0YXRzLmF0aW1lTXM7XHJcbiAgICAgICAgICAgIG1ldGEubW9kaWZpZWQgPSBzdGF0cy5tdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLnNpemUgPSBzdGF0cy5zaXplO1xyXG4gICAgICAgICAgICBpZiAoIWlzUGx1Z2luKSB7XHJcbiAgICAgICAgICAgICAgICBtZXRhLmNzcyA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAobWV0YS5mb3JtYXQgPT0gXCJqc29uXCIpIG1ldGEuY3NzID0gbWV0YS5jc3Muc3BsaXQoXCJcXG5cIikuc2xpY2UoMSkuam9pbihcIlxcblwiKTtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBgbW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIG1vZHVsZS5maWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaWRFeHBvcnQgPSAhVXRpbHMuaXNFbXB0eShtb2R1bGUuZXhwb3J0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlkRXhwb3J0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWV0YS50eXBlID0gbW9kdWxlLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtZXRhO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gVXRpbHMud2FybihcIk1vZHVsZSBOb3QgRXhwb3J0ZWRcIiwgYCR7bWV0YS5uYW1lfSwgcGxlYXNlIHN0YXJ0IHNldHRpbmcgbW9kdWxlLmV4cG9ydHNgKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ICs9IGBcXG5tb2R1bGUuZXhwb3J0cyA9ICR7SlNPTi5zdHJpbmdpZnkobWV0YSl9O1xcbm1vZHVsZS5leHBvcnRzLnR5cGUgPSAke21ldGEuZXhwb3J0cyB8fCBtZXRhLm5hbWV9O2A7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbW9kdWxlLl9jb21waWxlKGNvbnRlbnQsIGZpbGVuYW1lKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VQbGFjZWhvbGRlclBsdWdpbihkYXRhKSB7XHJcbiAgICAgICAgcmV0dXJuIHtwbHVnaW46IHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0OiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgIGdldE5hbWU6ICgpID0+IHtyZXR1cm4gZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWU7fSxcclxuICAgICAgICAgICAgICAgIGdldEF1dGhvcjogKCkgPT4ge3JldHVybiBcIj8/P1wiO30sXHJcbiAgICAgICAgICAgICAgICBnZXREZXNjcmlwdGlvbjogKCkgPT4ge3JldHVybiBkYXRhLm1lc3NhZ2UgPyBkYXRhLm1lc3NhZ2UgOiBcIlRoaXMgcGx1Z2luIHdhcyB1bmFibGUgdG8gYmUgbG9hZGVkLiBDaGVjayB0aGUgYXV0aG9yJ3MgcGFnZSBmb3IgdXBkYXRlcy5cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0VmVyc2lvbjogKCkgPT4ge3JldHVybiBcIj8/P1wiO31cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lIHx8IGRhdGEuZmlsZW5hbWUsXHJcbiAgICAgICAgICAgIGZpbGVuYW1lOiBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBzb3VyY2U6IGRhdGEuc291cmNlID8gZGF0YS5zb3VyY2UgOiBcIlwiLFxyXG4gICAgICAgICAgICB3ZWJzaXRlOiBkYXRhLndlYnNpdGUgPyBkYXRhLndlYnNpdGUgOiBcIlwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuXHJcbiAgICAgICAgaWYoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgfSwgKGhhc2gpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3VzcGVjdDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc2g6IGhhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgdHJ1ZSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYocmVzdWx0KXtcclxuICAgICAgICAgICAgICAgIGFkZG9uQ2FjaGVbcmVzdWx0Lmhhc2hdID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICBoYXNoOiByZXN1bHQuaGFzaCxcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgICAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiVGhpcyBwbHVnaW4gbWlnaHQgYmUgZGFuZ2Vyb3VzIChcIityZXN1bHQuaGFybStcIikuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge3dpbmRvdy5yZXF1aXJlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpO31cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgY29tcGlsZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyb3IubWVzc2FnZSwgc3RhY2s6IGVycm9yLnN0YWNrfX07fVxyXG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTtcclxuICAgICAgICBpZighY29udGVudC5uYW1lKXJldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNhbm5vdCBlc2NhcGUgdGhlIElELlwiLCBlcnJvcjoge21lc3NhZ2U6IFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwiLCBzdGFjazogXCJDYW5ub3QgcmVhZCBwcm9wZXJ0eSAncmVwbGFjZScgb2YgdW5kZWZpbmVkXCJ9fVxyXG4gICAgICAgIGNvbnRlbnQuaWQgPSBVdGlscy5lc2NhcGVJRChjb250ZW50Lm5hbWUpO1xyXG4gICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQudHlwZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV07XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbnN0cnVjdGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBiZHRoZW1lc1tjb250ZW50Lm5hbWVdO1xyXG4gICAgICAgICAgICBiZHRoZW1lc1tjb250ZW50Lm5hbWVdID0gY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICB9ICAgXHJcblxyXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgd2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgdW5sb2FkZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fTt9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMb2FkZWQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiBmYWxzZTt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGNhbnRVbmxvYWQgPSB0aGlzLnVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgICAgIGlmIChjYW50VW5sb2FkKSByZXR1cm4gY2FudFVubG9hZDtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoYmFzZWRpcik7XHJcbiAgICAgICAgY29uc3QgY29udGVudExpc3QgPSBPYmplY3QudmFsdWVzKGlzUGx1Z2luID8gYmRwbHVnaW5zIDogYmR0aGVtZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcclxuICAgICAgICBjb25zdCBhZGRlZCA9IGZpbGVzLmZpbHRlcihmID0+ICFjb250ZW50TGlzdC5maW5kKHQgPT4gdC5maWxlbmFtZSA9PSBmKSAmJiBmLmVuZHNXaXRoKGZpbGVFbmRpbmcpICYmIGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmKSkuaXNGaWxlKCkpO1xyXG4gICAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBbGxDb250ZW50KHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZpbGVzKSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VkaXIsIGZpbGVuYW1lKSkuaXNGaWxlKCkgfHwgIWZpbGVuYW1lLmVuZHNXaXRoKGZpbGVFbmRpbmcpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCB0aGlzLmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICAgICAgaWYgKGVycm9yKSBlcnJvcnMucHVzaChlcnJvcik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXJyb3JzO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRQbHVnaW5zKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwicGx1Z2luXCIpO31cclxuICAgIGxvYWRUaGVtZXMoKSB7cmV0dXJuIHRoaXMubG9hZEFsbENvbnRlbnQoXCJ0aGVtZVwiKTt9XHJcbn07XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvbnRlbnRNYW5hZ2VyIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiaW1wb3J0IHtiZENvbmZpZywgbWluU3VwcG9ydGVkVmVyc2lvbiwgYmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luRXJyb3JzLCBiZHRoZW1lRXJyb3JzLCBiYmRDaGFuZ2Vsb2csIGRlZmF1bHRDb29raWUsIGN1cnJlbnREaXNjb3JkVmVyc2lvbiwgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQkRMb2dvIGZyb20gXCIuLi91aS9iZExvZ29cIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgTGlnaHRjb3JkTG9nbyBmcm9tIFwiLi4vc3ZnL2xpZ2h0Y29yZFwiO1xyXG5pbXBvcnQgUGx1Z2luQ2VydGlmaWVyIGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5pbXBvcnQgZGlzdGFudCwgeyB1dWlkdjQgfSBmcm9tIFwiLi9kaXN0YW50XCI7XHJcbmltcG9ydCBFbW9qaU1vZHVsZSBmcm9tIFwiLi9lbW9qaU1vZHVsZVwiXHJcbmltcG9ydCB7cmVtb3RlIGFzIGVsZWN0cm9ufSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgdjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuZnVuY3Rpb24gQ29yZSgpIHtcclxuICAgIC8vIE9iamVjdC5hc3NpZ24oYmRDb25maWcsIF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKERhdGFTdG9yZS5jb25maWdGaWxlKSk7XHJcbiAgICAvLyB0aGlzLmluaXQoKTtcclxufVxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKCFBcnJheS5wcm90b3R5cGUuZmxhdCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmJkVmVyc2lvbiArIFwiIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBvbGQgdmVyc2lvbiAoXCIgKyBjdXJyZW50RGlzY29yZFZlcnNpb24gKyBcIikgb2YgRGlzY29yZC4gUGxlYXNlIHVwZGF0ZSB5b3VyIERpc2NvcmQgaW5zdGFsbGF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGJkQ29uZmlnLnZlcnNpb24gPCBtaW5TdXBwb3J0ZWRWZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiZENvbmZpZy52ZXJzaW9uICsgXCIgKHlvdXIgdmVyc2lvbilcIiArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxhdGVzdCBqcyAoXCIgKyBiYmRWZXJzaW9uICsgXCIpLjxicj48YnI+IFBsZWFzZSBkb3dubG9hZCB0aGUgbGF0ZXN0IHZlcnNpb24gZnJvbSA8YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkdpdEh1YjwvYT5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuRUQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBFbmhhbmNlZERpc2NvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LldlYlNvY2tldCAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUgJiYgd2luZG93LldlYlNvY2tldC5uYW1lLmluY2x1ZGVzKFwiUGF0Y2hlZFwiKSkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIFBvd2VyY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRyaWJ1dGVzLmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIC8qXHJcbiAgICBjb25zdCBsYXRlc3RMb2NhbFZlcnNpb24gPSBiZENvbmZpZy51cGRhdGVyID8gYmRDb25maWcudXBkYXRlci5MYXRlc3RWZXJzaW9uIDogYmRDb25maWcubGF0ZXN0VmVyc2lvbjtcclxuICAgIGlmIChsYXRlc3RMb2NhbFZlcnNpb24gPiBiZENvbmZpZy52ZXJzaW9uKSB7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiVXBkYXRlIEF2YWlsYWJsZVwiLCBbYFRoZXJlIGlzIGFuIHVwZGF0ZSBhdmFpbGFibGUgZm9yIEJhbmRhZ2VkQkQncyBJbmplY3RvciAoJHtsYXRlc3RMb2NhbFZlcnNpb259KS5gLCBcIllvdSBjYW4gZWl0aGVyIHVwZGF0ZSBhbmQgcmVzdGFydCBub3csIG9yIGxhdGVyLlwiXSwge1xyXG4gICAgICAgICAgICBjb25maXJtVGV4dDogXCJVcGRhdGUgTm93XCIsXHJcbiAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiTWF5YmUgTGF0ZXJcIixcclxuICAgICAgICAgICAgb25Db25maXJtOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvblVwZGF0ZUZhaWxlZCA9ICgpID0+IHtVdGlscy5hbGVydChcIkNvdWxkIE5vdCBVcGRhdGVcIiwgYFVuYWJsZSB0byB1cGRhdGUgYXV0b21hdGljYWxseSwgcGxlYXNlIGRvd25sb2FkIHRoZSBpbnN0YWxsZXIgYW5kIHJlaW5zdGFsbCBub3JtYWxseS48YnIgLz48YnIgLz48YSBocmVmPSdodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3JlbGVhc2VzL2xhdGVzdCcgdGFyZ2V0PSdfYmxhbmsnPkRvd25sb2FkIEluc3RhbGxlcjwvYT5gKTt9O1xyXG4gICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWRVcGRhdGUgPSBhd2FpdCB0aGlzLnVwZGF0ZUluamVjdG9yKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWRVcGRhdGUpIHJldHVybiBvblVwZGF0ZUZhaWxlZCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcCA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5yZWxhdW5jaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGFwcC5leGl0KCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfSovXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIEFkZG9ucyBDYWNoZVwiKVxyXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIGF0b2IoRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpKSk7XHJcblxyXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWRjLTBcIl0pIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYnRuLmJ0bi1kaXNjb25uZWN0XCIpLmNsaWNrKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBQbHVnaW5DZXJ0aWZpZXIuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJSZW1vdmluZyBMb2FkaW5nIEljb25cIik7XHJcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpLmxlbmd0aCkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcImJkLWxvYWRlcnYyXCIpWzBdLnJlbW92ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBNYWluIE9ic2VydmVyXCIpO1xyXG4gICAgdGhpcy5pbml0T2JzZXJ2ZXIoKTtcclxuXHJcbiAgICAvLyBTaG93IGxvYWRpbmcgZXJyb3JzXHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIHtcclxuICAgICAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiQ29sbGVjdGluZyBTdGFydHVwIEVycm9yc1wiKTtcclxuICAgICAgICBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogYmRwbHVnaW5FcnJvcnMsIHRoZW1lczogYmR0aGVtZUVycm9yc30pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHByZXZpb3VzVmVyc2lvbiA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJ2ZXJzaW9uXCIpO1xyXG4gICAgaWYgKGJiZFZlcnNpb24gPiBwcmV2aW91c1ZlcnNpb24pIHtcclxuICAgICAgICBpZiAoYmJkQ2hhbmdlbG9nKSB0aGlzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJ2ZXJzaW9uXCIsIGJiZFZlcnNpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIEVtb2ppTW9kdWxlLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoU29jaWFsLmJpbmQodGhpcyksIFwiQkQgU29jaWFsIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRQaWxscy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFBpbGxzIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRMaXN0SXRlbXMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBMaXN0IEl0ZW1zIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoR3VpbGRTZXBhcmF0b3IuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBTZXBhcmF0b3IgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZXNzYWdlSGVhZGVyLmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgQ2hhdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lbWJlckxpc3QuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBNZW1iZXIgTGlzdCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dGFjaG1lbnQuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgaWYoYmRDb25maWcuaGF2ZUluc3RhbGxlZERlZmF1bHQpe1xyXG4gICAgICAgIGxldCBhbGVydCA9IFV0aWxzLmFsZXJ0KFwiRmlyc3QgSW5zdGFsbGF0aW9uXCIsIFwiQXMgaXQgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGluc3RhbGwgTGlnaHRjb3JkLCBXZSBhZGRlZCB0d28gZGVmYXVsdCB0aGVtZXMgYW5kIG9uZSBkZWZhdWx0IHBsdWdpbiBpbiB5b3VyIHBsdWdpbi90aGVtZSBmb2xkZXIuIENoZWNrIGl0IGluIHRoZSBQbHVnaW4vVGhlbWUgc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYWxlcnQub25DbG9zZShyZXNvbHZlKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICBjb25zdCBsb2dvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnQgPiBkaXYudHlwZVdpbmRvd3MtMXphLW43LndpdGhGcmFtZS1oYVlsdEkudGl0bGVCYXItQUM0cEdWLmhvcml6b250YWxSZXZlcnNlLTN0UmpZNy5mbGV4LTFPMUdLWS5kaXJlY3Rpb25Sb3dSZXZlcnNlLW04SWpJcS5qdXN0aWZ5U3RhcnQtMk5ERnppLmFsaWduU3RyZXRjaC1EcEdQZjMuZGEtdHlwZVdpbmRvd3MuZGEtd2l0aEZyYW1lLmRhLXRpdGxlQmFyLmRhLWhvcml6b250YWxSZXZlcnNlLmRhLWZsZXguZGEtZGlyZWN0aW9uUm93UmV2ZXJzZS5kYS1qdXN0aWZ5U3RhcnQuZGEtYWxpZ25TdHJldGNoID4gZGl2LndvcmRtYXJrV2luZG93cy0xdjBsWUQud29yZG1hcmstMmlERGZtLmRhLXdvcmRtYXJrV2luZG93cy5kYS13b3JkbWFya1wiKVxyXG4gICAgaWYobG9nbyl7XHJcbiAgICAgICAgbG9nby5zdHlsZS50b3AgPSBcIjNweFwiXHJcbiAgICAgICAgbG9nby5pbm5lckhUTUwgPSBgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMTBcIiB3aWR0aD1cIjcwXCIgdmlld0JveD1cIjAgMCA3Mi41NCAxMFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IC01cHgsIG1hcmdpbi10b3A6IDEwcHhcIj5cclxuICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTQ0LjgxLDkuNjdWNi4zM2MwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxQTMuNTMsMy41MywwLDAsMCw0Ni4yLDNjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNjdjMCwyLjIxLDEuODksMy4zMywzLjc3LDMuMzNhMy44NywzLjg3LDAsMCwwLDMuNDUtMi4xOGwtMi4xMi0xQzQ3LDExLjE3LDQ0LjgxLDEwLjg1LDQ0LjgxLDkuNjdaTTEwLjY4LDEyLjg5aDIuNDFWMy4xN0gxMC42OFpNNzEuNzYsMy4xNEg2OC4xOVY3LjIzTDcwLjU3LDkuNHYtNGgxLjI3Yy44MSwwLDEuMjEuNDEsMS4yMSwxdjNjMCwuNjMtLjM4LDEuMDUtMS4yMSwxLjA1SDY4LjE4djIuMzFoMy41N2MxLjkyLDAsMy43Mi0xLDMuNzItMy4yVjYuMzlDNzUuNDgsNC4xMyw3My42OCwzLjE0LDcxLjc2LDMuMTRaTTU0LjIyLDNjLTIsMC00LDEuMS00LDMuMzRWOS42NmMwLDIuMjMsMiwzLjM0LDQsMy4zNHMzLjk1LTEuMTEsMy45NS0zLjM0VjYuMzRDNTguMTksNC4xMSw1Ni4yLDMsNTQuMjIsM1ptMS41NSw2LjY2YzAsLjctLjc4LDEuMDYtMS41NCwxLjA2cy0xLjU1LS4zNS0xLjU1LTEuMDZWNi4zNGMwLS43Mi43NS0xLjEsMS41LTEuMXMxLjU5LjM1LDEuNTksMS4xWk02Ni44NCw2LjM0YzAtMi4yOS0xLjU4LTMuMi0zLjU1LTMuMkg1OS40NnY5LjczaDIuNDVWOS43N2guNDNsMi4yMiwzLjA5aDNMNjUsOS41MkM2Ni4xMyw5LjE1LDY2Ljg0LDguMTQsNjYuODQsNi4zNFpNNjMuMzMsNy42NUg2MS45MVY1LjQzaDEuNDJBMS4xMSwxLjExLDAsMSwxLDYzLjMzLDcuNjVaTTI5LjgzLDEzaDIuNDJWMy4wNkgyOS44M1Y2LjczbC0zLDBWMy4wOUgyNC43djkuNzhoMi4xNFY4LjY4bDMsMFpNMTcuMTYsOS43NlY2LjQyYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFhMy41NSwzLjU1LDAsMCwwLTMuMzYtMi4yNGMtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS43NmMwLDIuMjEsMiwzLjE1LDMuOSwzLjE1czMuNTgtMSwzLjU4LTNWNy41OEgxOC43OWwwLDEuMzZIMjAuM3YuNzdDMjAuMywxMC45MiwxNy4xNiwxMC45NCwxNy4xNiw5Ljc2WlwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMi45MyAtMylcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMzUuOTEgMC4wNiAzOC40MyAwLjA2IDM4LjQzIDEuODQgMzUuOTIgMS44MSAzNS45NyAxMCAzMy41NSAxMCAzMy40OSAxLjc1IDMwLjk4IDEuNzQgMzAuOTggMC4wNiAzMy40OSAwLjA2IDM1LjkxIDAuMDZcIi8+XHJcbiAgICA8cG9seWdvbiBmaWxsPVwiY3VycmVudENvbG9yXCIgcG9pbnRzPVwiMCA5Ljk3IDYuNSAxMCA2LjUgNy42MyAyLjQxIDcuNjMgMi40MSAwLjI2IDAgMi4yNiAwIDkuOTdcIi8+XHJcbjwvc3ZnPmBcclxuICAgIH1cclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoQXR0cmlidXRlcyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IGF0dHJpYnNQYXRjaHMgPSBbXVxyXG4gICAgdGhpcy5jYW5jZWxQYXRjaEF0dHJpYnV0ZXMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICBhdHRyaWJzUGF0Y2hzLmZvckVhY2goZSA9PiBlKCkpXHJcbiAgICB9XHJcblxyXG4gICAgd2hpbGUoIXYyLk1lc3NhZ2VDb21wb25lbnQpYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpXHJcbiAgICBcclxuICAgIC8vIFRPRE86IHRyeSB0byBwYXRjaCBjb3JyZWN0bHkgdGhlIHVzZXIgcG9wb3V0IG9uIGEgbmV4dCB1cGRhdGVcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkRpc2NvcmRUYWdcIilcclxuICAgIC50aGVuKERpc2NvcmRUYWcgPT4ge1xyXG4gICAgICAgIGxldCBEaXNjb3JkVGFnQ29tcCA9IERpc2NvcmRUYWcuZGVmYXVsdFxyXG4gICAgICAgIERpc2NvcmRUYWcuZGVmYXVsdCA9IGZ1bmN0aW9uKHByb3BzKXtcclxuICAgICAgICAgICAgbGV0IHJldHVyblZhbHVlID0gRGlzY29yZFRhZ0NvbXAocHJvcHMpXHJcblxyXG4gICAgICAgICAgICBsZXQgaWQgPSB1dWlkdjQoKVxyXG5cclxuICAgICAgICAgICAgbGV0IGJhZGdlRGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIixcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5Ub3A6IFwiNXB4XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7XHJcbiAgICAgICAgICAgICAgICBpZDogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiYmFkZ2VzLVwiK2lkLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImluaGVyaXRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSlcclxuXHJcbiAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IFtyZXR1cm5WYWx1ZV1cclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9wcy51c2VyLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcHMudXNlci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBwcm9wcy51c2VyLmlkID09PSBcIjY5NjAwMzQ1NjYxMTM4NTM5NlwiKXsgLy8gTm90IFRob21pejogTGlnaHRjb3JkIERldmVsb3BlciwgUGhvcmN5czogTGlnaHRjb3JkIERldmVsb3BlclxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9MaWdodGNvcmQvTGlnaHRjb3JkXCIsIHRpdGxlOiBcIkxpZ2h0Y29yZFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGJhZGdlRGl2KVxyXG4gICAgICAgICAgICBsZXQgZGl2ID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJibG9ja1wiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sIGNoaWxkcmVuKVxyXG4gICAgICAgICAgICBhcHBseUJhZGdlcyhpZCwgcHJvcHMudXNlciwgZmFsc2UpXHJcblxyXG4gICAgICAgICAgICByZXR1cm4gZGl2XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxuXHJcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZihkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UpeyAvLyB0aGlzIGNhbiBiZSBhIGJsb2NrZWQgbWVzc2FnZSAobm90IG9wZW5lZClcclxuICAgICAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcImRhdGEtbWVzc2FnZS1pZFwiXSA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZS5pZFxyXG4gICAgICAgIH1cclxuICAgIH19KSlcclxuICAgICAgICAvKlxyXG4gICAgYXR0cmlic1BhdGNocy5wdXNoKFV0aWxzLm1vbmtleVBhdGNoKHYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wc1tcIm1lc3NhZ2UtaWRcIl0gPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLm1lc3NhZ2UuaWRcclxuICAgIH19KSkqL1xyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5jaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHRpbWVzQ2hlY2tlZCA9IDA7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IEJEVjIuZ3VpbGRDbGFzc2VzLndyYXBwZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGQgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVzQ2hlY2tlZCA+PSA1MCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9IFwibG9hZGluZ1wiKSBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO30pO1xyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcclxuICAgIGlmICh3aW5kb3cucmVxdWlyZS5vcmlnaW5hbCkgd2luZG93LnJlcXVpcmUgPSB3aW5kb3cucmVxdWlyZS5vcmlnaW5hbDtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucHJvdG90eXBlICYmIGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMpXHJcbiAgICAudGhlbihzZXR0aW5nTW9kdWxlID0+IHtcclxuXHJcbiAgICAgICAgbGV0IGdldFByZWRpY2F0ZVNlY3Rpb25zID0gc2V0dGluZ01vZHVsZS5kZWZhdWx0LnByb3RvdHlwZS5nZXRQcmVkaWNhdGVTZWN0aW9uc1xyXG4gICAgICAgIHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnMgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UHJlZGljYXRlU2VjdGlvbnMuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcblxyXG4gICAgICAgICAgICBpZihyZXN1bHRbMV0uc2VjdGlvbiA9PT0gXCJNeSBBY2NvdW50XCIpeyAvLyB1c2VyIHNldHRpbmdzLCBub3QgZ3VpbGQgc2V0dGluZ3NcclxuICAgICAgICAgICAgICAgIGxldCBwb3BlZCA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG5cclxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLnNldHRpbmdzUGFuZWwucmVuZGVyU2lkZWJhcigpKVxyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlKHBvcGVkWzBdKXtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwb3BlZC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufTtcclxuXHJcblxyXG5sZXQgY2xhc3NOYW1lTGF5ZXJcclxubGV0IGNsYXNzTmFtZVNvY2lhbExpbmtzXHJcbmxldCBjbGFzc05hbWVNb2RhbFxyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdE9ic2VydmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgbWFpbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5Nb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHBsdWdpbk1vZHVsZS5yYXdPYnNlcnZlcihtdXRhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgbm90aGluZyBhZGRlZCwgc2tpcFxyXG4gICAgICAgICAgICBpZiAoIW11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoIHx8ICEobXV0YXRpb24uYWRkZWROb2Rlc1swXSBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZUxheWVyKWNsYXNzTmFtZUxheWVyID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXJcclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZVNvY2lhbExpbmtzKWNsYXNzTmFtZVNvY2lhbExpbmtzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zb2NpYWxMaW5rcyAmJiB0eXBlb2YgZS5zb2NpYWxMaW5rcyA9PT0gXCJzdHJpbmdcIilbMF0uc29jaWFsTGlua3NcclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZU1vZGFsKWNsYXNzTmFtZU1vZGFsID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tb2RhbCAmJiB0eXBlb2YgZS5tb2RhbCA9PT0gXCJzdHJpbmdcIiAmJiBlLmlubmVyICYmIHR5cGVvZiBlLmlubmVyID09PSBcInN0cmluZ1wiICYmICFlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSlbMF0ubW9kYWxcclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJndWlsZC1zZXR0aW5ncy1iYXNlLXNlY3Rpb25cIikubGVuZ3RoKSBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwic2VydmVyLXNldHRpbmdzXCIpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lU29jaWFsTGlua3MpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnRFbGVtZW50ID09IGRvY3VtZW50LmJvZHkgJiYgbm9kZS5xdWVyeVNlbGVjdG9yKFwiI2FjZV9zZXR0aW5nc21lbnVcIikpIG5vZGUuaWQgPSBcImFjZV9zZXR0aW5nc21lbnVfY29udGFpbmVyXCI7XHJcblxyXG4gICAgICAgICAgICAvLyBFbW9qaSBQaWNrZXJcclxuICAgICAgICAgICAgLy9ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJlbW9qaVBpY2tlci0zbTFTLWpcIikubGVuZ3RoICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuZW1vamlQaWNrZXItM20xUy1qXCIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5pbWF0b3JMZWZ0LTFFUXhVMFwiKVxyXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWFpbk9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5zaG93Q2hhbmdlbG9nTW9kYWwgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hTb2NpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnNvY2lhbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFUYWJCYXIpIHJldHVybjtcclxuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPCAzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKEFuY2hvcikge1xyXG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGU7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld09uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZSA9IG5ld09uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIHNpemVzLFxyXG4gICAgICAgICAgICBjbGFzc05hbWVWZXJzaW9uSGFzaFxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yTXV0ZWQpWzBdLmNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYExpZ2h0Y29yZCAke2VsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCBgKCR7KGVsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS5jb21taXQgfHwgXCJVbmtub3duXCIpLnNsaWNlKDAsIDcpfSlgKSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcclxuICAgICAgICBdXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2lvbnMgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlO1xyXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgIH07XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRHdWlsZENsYXNzZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIndyYXBwZXJcIiwgXCJ1bnJlYWRNZW50aW9uc0JhclwiKTtcclxuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcclxuICAgIGNvbnN0IHBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImJsb2JDb250YWluZXJcIik7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRMaXN0SXRlbXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xyXG4gICAgY29uc3QgbGlzdEl0ZW1DbGFzcyA9IEd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IEd1aWxkQ29tcG9uZW50ID0gcmVhY3RJbnN0YW5jZS5yZXR1cm4udHlwZTtcclxuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcclxuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZVxyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS51bnJlYWQpIGNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5zZWxlY3RlZCkgY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYXVkaW8pIGNsYXNzTmFtZSArPSBcIiBiZC1hdWRpb1wiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnZpZGVvKSBjbGFzc05hbWUgKz0gXCIgYmQtdmlkZW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5iYWRnZSkgY2xhc3NOYW1lICs9IFwiIGJkLWJhZGdlXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYW5pbWF0YWJsZSkgY2xhc3NOYW1lICs9IFwiIGJkLWFuaW1hdGFibGVcIjtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lXHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkUGlsbHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkUGlsbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xyXG4gICAgaWYgKCFndWlsZFBpbGwpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRQaWxsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChndWlsZFBpbGwsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuc2VsZWN0ZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcclxuICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcclxuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBndWlsZENvbXBvbmVudHMuU2VwYXJhdG9yKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlblszXS50eXBlID0gR3VpbGRTZXBhcmF0b3I7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgQXR0YWNobWVudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF0dGFjaG1lbnRcIilbMF0gLy8gdGVtcG9yYXJ5XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuQXR0YWNobWVudFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goQXR0YWNobWVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pcmV0dXJuXHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcclxuICAgICAgICAgICAgaWQ6IFwiY2VydGlmaWVkLVwiK2lkXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgUGx1Z2luQ2VydGlmaWVyLnBhdGNoKGF0dGFjaG1lbnQsIFwiY2VydGlmaWVkLVwiK2lkKVxyXG4gICAgfX0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVzc2FnZUhlYWRlciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVzc2FnZUhlYWRlclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZXNzYWdlSGVhZGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJNZXNzYWdlVGltZXN0YW1wXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVzc2FnZUhlYWRlciB8fCAhTWVzc2FnZUhlYWRlci5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lc3NhZ2VIZWFkZXIsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXV0aG9yID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJtZXNzYWdlLmF1dGhvclwiKTtcclxuICAgICAgICAvLyBjb25zdCBoZWFkZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wc1wiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXV0aG9yIHx8ICFhdXRob3IuaWQpcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChhdXRob3IuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYXV0aG9yLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IGF1dGhvci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgYXV0aG9yLCB0cnVlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGNoYXQpe1xyXG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiYWRnZXMtXCIraWQpXHJcbiAgICAgICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVyblxyXG4gICAgICAgIGlmKGRpdi5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5cclxuICAgICAgICBsZXQgYmxvY2tEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgYmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJsb2NrRGl2KVxyXG5cclxuICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuXHJcbiAgICAgICAgZGlzdGFudC5nZXRCYWRnZXModXNlci5pZClcclxuICAgICAgICAudGhlbihiYWRnZXMgPT4ge1xyXG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzdmc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtbG9nb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJhZGdlLnNjb3Blcy5mb3JFYWNoKHNjb3BlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy51c2VyID0gdXNlclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pIFxyXG4gICAgICAgICAgICAgICAgaWYoIWJhZGdlLmhyZWYpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLkFuY2hvciA9IEFuY2hvclxyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlLmhyZWYgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGJhZGdlLmhyZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2MiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXHJcbiAgICAgICAgICAgICAgICBkaXYyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVtYmVyTGlzdFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZW1iZXJMaXN0SXRlbSA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWVtYmVyTGlzdEl0ZW1cIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZW1iZXJMaXN0SXRlbSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyRGVjb3JhdG9ycykgcmV0dXJuO1xyXG4gICAgdGhpcy5tZW1iZXJMaXN0UGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUsIFwicmVuZGVyRGVjb3JhdG9yc1wiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhdXNlciB8fCAhdXNlci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpe1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGZhbHNlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGluamVjdGlvblBhdGggPSBEYXRhU3RvcmUuaW5qZWN0aW9uUGF0aDtcclxuICAgIGlmICghaW5qZWN0aW9uUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG4gICAgY29uc3Qgcm1yZiA9IHJlcXVpcmUoXCJyaW1yYWZcIik7XHJcbiAgICBjb25zdCB5YXV6bCA9IHJlcXVpcmUoXCJ5YXV6bFwiKTtcclxuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gLypyZXF1aXJlKFwicmVxdWVzdFwiKTsqLyBudWxsXHJcblxyXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xyXG4gICAgY29uc3QgZm9sZGVyTmFtZSA9IHBhdGguYmFzZW5hbWUoaW5qZWN0aW9uUGF0aCk7XHJcbiAgICBjb25zdCB6aXBMaW5rID0gXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL2FyY2hpdmUvaW5qZWN0b3IuemlwXCI7XHJcbiAgICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcclxuICAgIGNvbnN0IGV4dHJhY3RlZEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcIkJldHRlckRpc2NvcmRBcHAtaW5qZWN0b3JcIik7XHJcblxyXG4gICAgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkRvd25sb2FkaW5nIFwiICsgemlwTGluayk7XHJcbiAgICBsZXQgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIHJlcXVlc3QuZ2V0KHt1cmw6IHppcExpbmssIGVuY29kaW5nOiBudWxsfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21lb25lIGhhcyB0aGVpciBvd24gY29weVxyXG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhzYXZlZFppcCwgcmVzKSk7XHJcbiAgICAgICAgICAgIGlmIChhbHJlYWR5RXhpc3RzKSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMucmVuYW1lKHNhdmVkWmlwLCBgJHtzYXZlZFppcH0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gLCByZXMpKTtcclxuXHJcbiAgICAgICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiV3JpdGluZyBcIiArIHNhdmVkWmlwKTtcclxuICAgICAgICAgICAgZnMud3JpdGVGaWxlKHNhdmVkWmlwLCBib2R5LCBlcnIgPT4gcmVzb2x2ZSghZXJyKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGlmICghc3VjY2VzcykgcmV0dXJuIHN1Y2Nlc3M7XHJcblxyXG4gICAgLy8gQ2hlY2sgYW5kIGRlbGV0ZSByZW5hbWUgZXh0cmFjdGlvblxyXG4gICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoZXh0cmFjdGVkRm9sZGVyLCByZXMpKTtcclxuICAgIGlmIChhbHJlYWR5RXhpc3RzKSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgYCR7ZXh0cmFjdGVkRm9sZGVyfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG4gICAgXHJcbiAgICAvLyBVbnppcCB0aGUgZG93bmxvYWRlZCB6aXAgZmlsZVxyXG4gICAgY29uc3QgemlwZmlsZSA9IGF3YWl0IG5ldyBQcm9taXNlKHIgPT4geWF1emwub3BlbihzYXZlZFppcCwge2xhenlFbnRyaWVzOiB0cnVlfSwgKGVyciwgemlwKSA9PiAgcih6aXApKSk7XHJcbiAgICB6aXBmaWxlLm9uKFwiZW50cnlcIiwgZnVuY3Rpb24oZW50cnkpIHtcclxuICAgICAgICAvLyBTa2lwIGRpcmVjdG9yaWVzLCB0aGV5IGFyZSBoYW5kbGVkIHdpdGggbWtkaXJwXHJcbiAgICAgICAgaWYgKGVudHJ5LmZpbGVOYW1lLmVuZHNXaXRoKFwiL1wiKSkgcmV0dXJuIHppcGZpbGUucmVhZEVudHJ5KCk7XHJcblxyXG4gICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRXh0cmFjdGluZyBcIiArIGVudHJ5LmZpbGVOYW1lKTtcclxuICAgICAgICAvLyBNYWtlIGFueSBuZWVkZWQgcGFyZW50IGRpcmVjdG9yaWVzXHJcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIG1rZGlycC5zeW5jKHBhdGguZGlybmFtZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0oZW50cnksIGZ1bmN0aW9uKGVyciwgcmVhZFN0cmVhbSkge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZWFkU3RyZWFtLm9uKFwiZW5kXCIsIGZ1bmN0aW9uKCkge3ppcGZpbGUucmVhZEVudHJ5KCk7fSk7IC8vIEdvIHRvIG5leHQgZmlsZSBhZnRlciB0aGlzXHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShmcy5jcmVhdGVXcml0ZVN0cmVhbShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB6aXBmaWxlLnJlYWRFbnRyeSgpOyAvLyBTdGFydCByZWFkaW5nXHJcblxyXG4gICAgLy8gV2FpdCBmb3IgdGhlIGZpbmFsIGZpbGUgdG8gZmluaXNoXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHppcGZpbGUub25jZShcImVuZFwiLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyBmaW5hbCBzdGVwXHJcbiAgICBjb25zdCBiYWNrdXBGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgYCR7Zm9sZGVyTmFtZX0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGluamVjdGlvblBhdGgsIGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIGZvbGRlciB0byB3aGF0IGl0IHNob3VsZCBiZVxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XHJcbiAgICBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBpbmplY3Rpb25QYXRoLCBlcnIgPT4gcmVzb2x2ZSghZXJyKSkpO1xyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XHJcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgcmVuYW1lIGhhZCBpc3N1ZXMsIGRlbGV0ZSB3aGF0IHdlIHRyaWVkIHRvIHJlbmFtZSBhbmQgcmVzdG9yZSBiYWNrdXBcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihleHRyYWN0ZWRGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShiYWNrdXBGb2xkZXIsIGluamVjdGlvblBhdGgsIHJlc29sdmUpKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxyXG4gICAgLy8gQ2xlYW51cCB0aGUgYmFja3VwIGZvbGRlciB0aGVuIHJlbW92ZSB0aGUgemlwXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnVubGluayhzYXZlZFppcCwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiSW5qZWN0b3IgVXBkYXRlZCFcIik7XHJcbiAgICByZXR1cm4gc3VjY2VzcztcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBDb3JlKCk7XHJcblxyXG4vKipcclxuICogRG9uJ3QgZXhwb3NlIGNvcmUgLSBjb3VsZCBiZSBkYW5nZXJvdXMgZm9yIG5vd1xyXG4gKi8iLCJjb25zdCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyA9IHdpbmRvdy5yZXF1aXJlXHJcblxyXG5pbXBvcnQge2JkQ29uZmlnfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERhdGFTdG9yZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRhdGEgPSB7c2V0dGluZ3M6IHtzdGFibGU6IHt9LCBjYW5hcnk6IHt9LCBwdGI6IHt9fX07XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhID0ge307XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRhdGFTdG9yZSA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWFsaXplKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLkJERmlsZSkpIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5CREZpbGUsIFwiYmluYXJ5XCIpKVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZnMudW5saW5rU3luYyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCB7W3JlbGVhc2VDaGFubmVsXTogc2V0dGluZ3N9KTtcclxuICAgICAgICAgICAgZWxzZSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCBzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QkREYXRhKFwic2V0dGluZ3NcIiwgc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgVXRpbHMuYWxlcnQoXCJDb3JydXB0IFN0b3JhZ2VcIiwgXCJUaGUgYmQgc3RvcmFnZSBoYXMgc29tZWhvdyBiZWNvbWUgY29ycnVwdC4gWW91IG1heSBlaXRoZXIgdHJ5IHRvIHNhbHZhZ2UgdGhlIGZpbGUgb3IgZGVsZXRlIGl0IHRoZW4gcmVsb2FkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGluamVjdGlvblBhdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3Rpb25QYXRoKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aDtcclxuICAgICAgICBjb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBlbGVjdHJvbi5nZXRBcHBQYXRoKCk7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0Jhc2UgPSBlbGVjdHJvbi5nZXRQYXRoKFwidXNlckRhdGFcIik7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0xvY2F0aW9uID0gcGF0aC5yZXNvbHZlKHJvYW1pbmdCYXNlLCBlbGVjdHJvbi5nZXRWZXJzaW9uKCksIFwibW9kdWxlc1wiLCBcImRpc2NvcmRfZGVza3RvcF9jb3JlXCIsIFwiaW5qZWN0b3JcIik7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBwYXRoLnJlc29sdmUoYmFzZSwgXCIuLlwiLCBcImFwcFwiKTtcclxuICAgICAgICBjb25zdCByZWFsTG9jYXRpb24gPSBmcy5leGlzdHNTeW5jKGxvY2F0aW9uKSA/IGxvY2F0aW9uIDogZnMuZXhpc3RzU3luYyhyb2FtaW5nTG9jYXRpb24pID8gcm9hbWluZ0xvY2F0aW9uIDogbnVsbDtcclxuICAgICAgICBpZiAoIXJlYWxMb2NhdGlvbikgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gcmVhbExvY2F0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWdGaWxlKCkge3JldHVybiB0aGlzLl9jb25maWdGaWxlIHx8ICh0aGlzLl9jb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMuaW5qZWN0aW9uUGF0aCwgXCJiZXR0ZXJkaXNjb3JkXCIsIFwiY29uZmlnLmpzb25cIikpO31cclxuICAgIGdldCBCREZpbGUoKSB7cmV0dXJuIHRoaXMuX0JERmlsZSB8fCAodGhpcy5fQkRGaWxlID0gcGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoLCBcImJkc3RvcmFnZS5qc29uXCIpKTt9XHJcbiAgICBnZXQgc2V0dGluZ3NGaWxlKCkge3JldHVybiB0aGlzLl9zZXR0aW5nc0ZpbGUgfHwgKHRoaXMuX3NldHRpbmdzRmlsZSA9IHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCwgXCJiZHNldHRpbmdzLmpzb25cIikpO31cclxuICAgIGdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkge3JldHVybiBwYXRoLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgcGx1Z2luTmFtZSArIFwiLmNvbmZpZy5qc29uXCIpO31cclxuXHJcbiAgICBnZXRTZXR0aW5nR3JvdXAoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNldHRpbmdHcm91cChrZXksIGRhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gPSBkYXRhO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJERGF0YShrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW2tleV0gfHwgXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICBzZXRCRERhdGEoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuZGF0YVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybjtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwiYmluYXJ5XCIpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERldk1vZGUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0xpc3RlbmVyID0gdGhpcy5kZWJ1Z0xpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lciA9IHRoaXMuY29weVNlbGVjdG9yTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICB0aGlzLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgdGhpcy5zdGFydENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICB0aGlzLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydERlYnVnTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIHRoaXMuZGVidWdMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcERlYnVnTGlzdGVuZXIoKSB7XHJcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydENvcHlTZWxlY3RvcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcENvcHlTZWxlY3RvcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lcik7XHJcbiAgICB9XHJcblxyXG4gICAgZGVidWdMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDExOSB8fCBlLndoaWNoID09IDExOCkgey8vRjhcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCIlY1slY0Rldk1vZGUlY10gJWNCcmVhay9SZXN1bWVcIiwgXCJjb2xvcjogcmVkO1wiLCBcImNvbG9yOiAjMzAzMDMwOyBmb250LXdlaWdodDo3MDA7XCIsIFwiY29sb3I6cmVkO1wiLCBcIlwiKTtcclxuICAgICAgICAgICAgZGVidWdnZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZGVidWdnZXJcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29weVNlbGVjdG9yTGlzdGVuZXIoZSkge1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3IgPSB0aGlzLmdldFNlbGVjdG9yKGUudGFyZ2V0KTtcclxuICAgIFxyXG4gICAgICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICAgICAgY2xhc3NMYXllciwgXHJcbiAgICAgICAgICAgICAgICBjbGFzc0l0ZW1zXHJcbiAgICAgICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLmxheWVyICYmIHR5cGVvZiBlLmxheWVyID09PSBcInN0cmluZ1wiICYmIGUuZGlzYWJsZWRQb2ludGVyRXZlbnRzKVswXSxcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUubWVudSlbMF1cclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZnVuY3Rpb24gYXR0YWNoKCkge1xyXG4gICAgICAgICAgICAgICAgaWYoIWNsYXNzSXRlbXMgfHwgIWNsYXNzTGF5ZXIubGF5ZXIpcmV0dXJuIGNvbnNvbGUubG9nKGNsYXNzSXRlbXMsIGNsYXNzTGF5ZXIubGF5ZXIpXHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IGNtID0gRE9NLnF1ZXJ5KFwiLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzSXRlbXMubWVudSkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFjbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5xdWVyeShcIiNhcHAtbW91bnQgPiAuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NMYXllci5sYXllckNvbnRhaW5lcikpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0xheWVyLmxheWVyfVwiPmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubWVudX0gJHtjbGFzc0l0ZW1zLnN0eWxlRmxleGlibGV9ICR7Y2xhc3NJdGVtcy5hY2NvbW1vZGF0ZVNjcm9sbGJhcn0gYmQtY29udGV4dC1tZW51XCIgc3R5bGU9XCJcIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuYXBwZW5kKGNtKTtcclxuICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGNtV3JhcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLnN0eWxlLnRvcCA9IGUuY2xpZW50WSArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUubGVmdCA9IGUuY2xpZW50WCArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc2V0QXR0cmlidXRlKFwicm9sZVwiLCBcIm1lbnVcIilcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5pZCA9IFwiYmQtY29weS1zZWxlY3Rvci1jb250ZXh0XCJcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCBcIkNvcHkgU2VsZWN0b3IgQWN0aW9uc1wiKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlckNsYXNzZXMgPSBCRE1vZHVsZXMuZ2V0KChlKSA9PiBlLnNjcm9sbGVyV3JhcClbMF1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlcldyYXAgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7c2Nyb2xsZXJDbGFzc2VzLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlckNsYXNzZXMuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJDbGFzc2VzLnRoZW1lR2hvc3RIYWlybGluZX1cIj48L2Rpdj5gKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke0JETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGVyKVswXS5zY3JvbGxlcn0gJHtjbGFzc0l0ZW1zLnNjcm9sbGVyfVwiPjwvZGl2PmApXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXJXcmFwLmFwcGVuZChzY3JvbGxlcilcclxuICAgICAgICAgICAgICAgICAgICBjbS5hcHBlbmQoc2Nyb2xsZXJXcmFwKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDTSA9IGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSAmJiBlLmtleUNvZGUgIT09IDI3KSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNtV3JhcC5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNvbnRleHRtZW51XCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gY20ucGFyZW50RWxlbWVudFxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IGNtLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1swXVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY21nID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgcm9sZT1cImdyb3VwXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHtIVE1MRWxlbWVudH1cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY21pID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMuaXRlbX0gJHtjbGFzc0l0ZW1zLmxhYmVsQ29udGFpbmVyfSAke2NsYXNzSXRlbXMuY29sb3JEZWZhdWx0fVwiIHJvbGU9XCJtZW51aXRlbVwiIGlkPVwiYmQtY29weS1zZWxlY3Rvci1pdGVtLWNtXCI+PC9kaXY+YCk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYXBwZW5kKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtjbGFzc0l0ZW1zLmxhYmVsfVwiPkNvcHkgU2VsZWN0b3I8L2Rpdj5gKSk7XHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLk5hdGl2ZU1vZHVsZS5jb3B5KHNlbGVjdG9yKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRzID0gRE9NLnF1ZXJ5QWxsKFwiZGl2W3JvbGU9bWVudWl0ZW1dLlwiK1V0aWxzLnJlbW92ZURhKGNsYXNzSXRlbXMuZm9jdXNlZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgJiYgZWxlbWVudHMuZm9yRWFjaChlbGVtID0+IGVsZW0uY2xhc3NMaXN0LnJlbW92ZShjbGFzc0l0ZW1zLmZvY3VzZWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtaS5jbGFzc0xpc3QuYWRkKGNsYXNzSXRlbXMuZm9jdXNlZClcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBjbWkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NJdGVtcy5mb2N1c2VkKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGNtZy5hcHBlbmQoY21pKTtcclxuICAgICAgICAgICAgICAgIGlmKHNjcm9sbGVyLmNoaWxkTm9kZXMubGVuZ3RoKXsgLy8gYXBlbmQgYSBzZXBhcmF0b3JcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwic2VwYXJhdG9yXCIgY2xhc3M9XCIke2NsYXNzSXRlbXMuc2VwYXJhdG9yfVwiPjwvZGl2PmApXHJcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKHNlcGFyYXRvcilcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZChjbWcpO1xyXG4gICAgICAgICAgICAgICAgaWYoY21XcmFwLmNsaWVudEhlaWdodCA8IGNtV3JhcC5zY3JvbGxIZWlnaHQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmcgXCIrY21XcmFwLnN0eWxlLnRvcClcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gKGNtV3JhcC5zdHlsZS50b3AgLSBjbWcuY2xpZW50SGVpZ2h0KSArIFwicHhcIjtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIm92ZXJmbG93aW5nXCIrY21XcmFwLnN0eWxlLnRvcClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoYXR0YWNoLCAxKTtcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0b3IoZWxlbWVudCkge1xyXG4gICAgICAgIGlmIChlbGVtZW50LmlkKSByZXR1cm4gYCMke2VsZW1lbnQuaWR9YDtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBcclxuICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBcclxuICAgICAgICAgKi9cclxuICAgICAgICBmdW5jdGlvbiBmdWxsUGF0aChlbCl7XHJcbiAgICAgICAgICAgIHZhciBuYW1lcyA9IFtdO1xyXG4gICAgICAgICAgICB3aGlsZSAoZWwucGFyZW50Tm9kZSl7XHJcbiAgICAgICAgICAgICAgaWYgKGVsLmlkKXtcclxuICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoJyMnK2VsLmlkKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsPT1lbC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgbmFtZXMudW5zaGlmdChlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkrQXJyYXkuZnJvbShlbC5jbGFzc0xpc3QuZW50cmllcygpKS5tYXAoZSA9PiBcIi5cIitlKS5qb2luKFwiXCIpKTtcclxuICAgICAgICAgICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MSxlPWVsO2UucHJldmlvdXNFbGVtZW50U2libGluZztlPWUucHJldmlvdXNFbGVtZW50U2libGluZyxjKyspO1xyXG4gICAgICAgICAgICAgICAgICBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSsoKHR5cGVvZiBlbC5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWwuY2xhc3NOYW1lKSB8fCBcIlwiKS5zcGxpdChcIiBcIikuZmlsdGVyKGUgPT4gISFlKS5tYXAoZSA9PiBcIi5cIitlKS5qb2luKFwiXCIpK1wiOm50aC1jaGlsZChcIitjK1wiKVwiKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsPWVsLnBhcmVudE5vZGU7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBuYW1lcy5qb2luKFwiID4gXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZnVsbFBhdGgoZWxlbWVudClcclxuICAgICAgICAvKlxyXG4gICAgICAgIGNvbnN0IHJ1bGVzID0gdGhpcy5nZXRSdWxlcyhlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBsYXRlc3RSdWxlID0gcnVsZXNbcnVsZXMubGVuZ3RoIC0gMV07XHJcbiAgICAgICAgaWYgKGxhdGVzdFJ1bGUpIHJldHVybiBsYXRlc3RSdWxlLnNlbGVjdG9yVGV4dDtcclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmNsYXNzTGlzdC5sZW5ndGgpIHJldHVybiBgLiR7QXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCkuam9pbihcIi5cIil9YDtcclxuICAgICAgICByZXR1cm4gYC4ke0FycmF5LmZyb20oZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdCkuam9pbihcIi5cIil9YDsqL1xyXG4gICAgfVxyXG5cclxuICAgIGdldFJ1bGVzKGVsZW1lbnQsIGNzcyA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cykge1xyXG4gICAgICAgIC8vaWYgKHdpbmRvdy5nZXRNYXRjaGVkQ1NTUnVsZXMpIHJldHVybiB3aW5kb3cuZ2V0TWF0Y2hlZENTU1J1bGVzKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IHNoZWV0cyA9IFsuLi5jc3NdLmZpbHRlcihzID0+ICFzLmhyZWYgfHwgIXMuaHJlZi5pbmNsdWRlcyhcIkJldHRlckRpc2NvcmRBcHBcIikpO1xyXG4gICAgICAgIGNvbnN0IHJ1bGVzID0gc2hlZXRzLm1hcChzID0+IFsuLi4ocy5jc3NSdWxlcyB8fCBbXSldKS5mbGF0KCk7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudFJ1bGVzID0gcnVsZXMuZmlsdGVyKHIgPT4gciAmJiByLnNlbGVjdG9yVGV4dCAmJiBlbGVtZW50Lm1hdGNoZXMoci5zZWxlY3RvclRleHQpICYmIHIuc3R5bGUubGVuZ3RoICYmIHIuc2VsZWN0b3JUZXh0LnNwbGl0KFwiLCBcIikubGVuZ3RoIDwgOCAmJiAhci5zZWxlY3RvclRleHQuc3BsaXQoXCIsIFwiKS5pbmNsdWRlcyhcIipcIikpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50UnVsZXM7XHJcbiAgICB9XHJcbn07IiwiZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIERpc2FibGVUeXBpbmcge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuc3RhcnRUeXBpbmcpXHJcbiAgICAgICAgLnRoZW4odHlwaW5nTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzXHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VHlwaW5nID0gdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RhcnRUeXBpbmdcclxuICAgICAgICAgICAgdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RhcnRUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RhcnRUeXBpbmcuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3Qgc3RvcFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmdcclxuICAgICAgICAgICAgdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RvcFR5cGluZyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBpZihzZWxmLmRpc2FibGVkKXJldHVybiBzdG9wVHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICAgICAgfSlcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGlzYWJsZVR5cGluZyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2VcclxuICAgIH1cclxufSIsImltcG9ydCBCdWdIdW50ZXJCYWRnZSBmcm9tIFwiLi4vc3ZnL2J1Z19odW50ZXJcIlxyXG5pbXBvcnQgTGlnaHRjb3JkVXNlckJhZGdlIGZyb20gXCIuLi9zdmcvTGlnaHRjb3JkVXNlclwiO1xyXG5pbXBvcnQgbm9kZUZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcclxuaW1wb3J0IHsgc2V0dGluZ3NDb29raWUgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENpcmN1cyBmcm9tIFwiLi4vc3ZnL2NpcmN1c1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHsgLy8gR2VuZXJhdGUgVVVJRCAoTm8gY3J5cHRvIHJuZylcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uKGMpIHtcclxuICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbn0gIFxyXG5cclxuY29uc3QgYXdhaXRpbmdCYWRnZXNQcm9taXNlcyA9IHt9XHJcbmxldCBiYWRnZXNUb0ZldGNoID0gW11cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXN0YW50U2VydmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczoge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGlzdGFudFNlcnZlciA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FjaGUoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FjaGUoZGF0YSl7XHJcbiAgICAgICAgaWYodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHRoaXMuX2NhY2hlICE9PSBcIm9iamVjdFwiKXJldHVybiB0aGlzLl9jYWNoZSA9IGRhdGFcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUgPSBPYmplY3QuYXNzaWduKHRoaXMuX2NhY2hlLCBkYXRhKVxyXG4gICAgfS8qXHJcblxyXG4gICAgYXN5bmMgZGVsZXRlKCl7XHJcbiAgICAgICAgQmRBcGkuc2hvd1RvYXN0KFwiRGVsZXRpbmcgYWxsIGluZm9zIGFib3V0IHlvdSBvbiBMaWdodGNvcmQgU2VydmVycy4uLlwiLCB7dHlwZTogXCJ3YXJuXCJ9KVxyXG4gICAgICAgIHJldHVybiBoYW5kbGVSZXF1ZXN0KFJvdXRlcy5kZWxldGUsIFwiZGVsZXRlXCIpXHJcbiAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXtcclxuICAgICAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQsIGNvdWxkbid0IGRlbGV0ZSBpbmZvcm1hdGlvbnMuIFNlZSBjb25zb2xlIGZvciBtb3JlIGluZm9zXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHsocmVzLnN0YXR1cytcIiBcIityZXMuc3RhdHVzVGV4dCtcIiBcIithd2FpdCByZXMudGV4dCgpKX1gKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgU3VjY2VzZnVsbHkgZGVsZXRlZCBpbmZvcm1hdGlvbnMuYClcclxuICAgICAgICAgICAgQmRBcGkuc2hvd1RvYXN0KFwiU3VjY2VzZnVsbHkgZGVsZXRlZCBpbmZvcm1hdGlvbnNcIiwge3R5cGU6IFwic3VjY2Vzc1wifSlcclxuICAgICAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiA9IG51bGxcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5qc29uKClcclxuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQsIGNvdWxkbid0IGRlbGV0ZSBpbmZvcm1hdGlvbnMuIFNlZSBjb25zb2xlIGZvciBtb3JlIGluZm9zXCIsIHt0eXBlOiBcImVycm9yXCJ9KVxyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkbid0IGRlbGV0ZSBhbGwgaW5mb3JtYXRpb25zOiAke2Vyci5zdGFja31gKVxyXG4gICAgICAgIH0pXHJcbiAgICB9Ki9cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBjdXN0b20gYmFkZ2VzIGZyb20gdGhlIHVzZXIgSUQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnN0YW50c1tcImJhZGdlc1wiXT59XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcclxuICAgICAgICBpZih0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXSlyZXR1cm4gdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICBpZihhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdKXJldHVybiBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcblxyXG4gICAgICAgIGxldCByZXNvbHZlXHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IChyZXNvbHZlID0gcmVzKSlcclxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxyXG5cclxuICAgICAgICBjb25zdCBiYWRnZXMgPSBbXVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKGJhZGdlLmRlZmF1bHRVc2Vycy5pbmNsdWRlcyh1c2VyKSliYWRnZXMucHVzaChiYWRnZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXJldHVybiByZXNvbHZlKFtdKVxyXG4gICAgICAgICAgICBiYWRnZXNUb0ZldGNoLnB1c2goW3VzZXIsIHJlc29sdmVdKVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IGJhZGdlc1RvRmV0Y2hcclxuICAgICAgICAgICAgICAgIGlmKHVzZXJzLmxlbmd0aCA9PT0gMClyZXR1cm5cclxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChSb3V0ZXMuYmFkZ2VzLCBcIlBPU1RcIiwgSlNPTi5zdHJpbmdpZnkodXNlcnMubWFwKGUgPT4gZVswXSkpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzcG9uc2VCb2R5KVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgdXNlciBvZiByZXNwb25zZUJvZHkpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IHVzZXJzLmZpbmQocHJvbWlzZSA9PiBwcm9taXNlWzBdID09PSB1c2VyLnVzZXJfaWQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2VbMV0odXNlci5iYWRnZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogZXJyb3JcclxuICAgICAgICAgICAgICAgICAgICBpZighKGVyciBpbnN0YW5jZW9mIExpZ2h0Y29yZEVycm9yKSljb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAwKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBmZXRjaGVkQmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoIUNvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBXZSBkbyBub3QgaGF2ZSB0aGUgQ29tcG9uZW50LCBza2lwIGl0LlxyXG4gICAgICAgICAgICBpZihiYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSljb250aW51ZSAvLyBBbHJlYWR5IGluc2VydGVkLlxyXG4gICAgICAgICAgICBiYWRnZXMucHVzaChDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczogT2JqZWN0LmFzc2lnbih0aGlzLmNhY2hlLmJhZGdlcywge1t1c2VyXTogYmFkZ2VzfSlcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIH0sIDYwMDAwMCk7XHJcblxyXG4gICAgICAgIHJlc29sdmUoYmFkZ2VzKVxyXG4gICAgICAgIGRlbGV0ZSBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcbiAgICAgICAgcmV0dXJuIGJhZGdlc1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBoYW5kbGVSZXF1ZXN0ID0gZnVuY3Rpb24ocm91dGUsIG1ldGhvZCwgZGF0YSl7XHJcbiAgICBpZighc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNVwiXSl7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBDYW5jZWxpbmcgcmVxdWVzdCBvbiAke3JvdXRlfSB3aXRoIG1ldGhvZCAke21ldGhvZH0gYW5kIGJvZHlgLCBkYXRhLCBcImJlY2F1c2Ugb2Ygc2V0dGluZ3MuXCIpXHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBMaWdodGNvcmRFcnJvcihcIlRoZSBjdXJyZW50IHNldHRpbmdzIGJsb2NrZWQgdGhlIHJlcXVlc3QuXCIpKVxyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coYFNlbmRpbmcgcmVxdWVzdCBvbiAke3JvdXRlfSB3aXRoIG1ldGhvZCAke21ldGhvZH0gYW5kIGJvZHlgLCBkYXRhKVxyXG4gICAgcmV0dXJuIG5vZGVGZXRjaChgJHtDb25zdGFudHMuU0VSVkVSX1VSTH0vYXBpL3YxJHtyb3V0ZX1gLCB7XHJcbiAgICAgICAgbWV0aG9kLFxyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJDTElFTlRcIjogXCJMaWdodGNvcmRcIixcclxuICAgICAgICAgICAgXCJBdXRob3JpemF0aW9uXCI6IHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gfHwgXCJOb25lOjpBbm9ueW1vdXNcIlxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgLi4uKGRhdGEgPyB7XHJcbiAgICAgICAgICAgIGJvZHk6IGRhdGFcclxuICAgICAgICB9IDoge30pXHJcbiAgICB9KVxyXG59XHJcblxyXG5jbGFzcyBMaWdodGNvcmRFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTGlnaHRjb3JkRXJyb3JcIlxyXG4gICAgICAgIFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgU0VSVkVSX1VSTDogXCJodHRwczovL2xpZ2h0Y29yZC5kZXJva3UueHl6L1wiLFxyXG4gICAgYmFkZ2VzOiBbIC8vIFRPRE86IFxyXG4gICAgICAgIC8qe1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZCBVc2VyXCIsXHJcbiAgICAgICAgICAgIGlkOiBcIjAxY2ZhN2IwLTdjZGItNGIwZS04MjU4LTljNmE3ODIzNWM5M1wiLFxyXG4gICAgICAgICAgICBkZWZhdWx0VXNlcnM6IFtdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtcclxuICAgICAgICAgICAgICAgIFwidXNlclwiXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIGNvbXBvbmVudDogTGlnaHRjb3JkVXNlckJhZGdlXHJcbiAgICAgICAgfSwgKi97XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiZjA0Njk4ZjUtODE2Yi00MWUzLWJkMDEtOTIyOTExOTNkN2E1XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xyXG4gICAgICAgICAgICAgICAgXCI2OTY0ODExOTQ0NDMwMTQxNzRcIixcclxuICAgICAgICAgICAgICAgIFwiNjk2MDAzNDU2NjExMzg1Mzk2XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBCdWdIdW50ZXJCYWRnZSxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcyNidWdfaHVudGVyXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQnVmZm9vblwiLFxyXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjM4OTAxNjg5NTU0MzcwNTYwMlwiLFxyXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIixcclxuICAgICAgICAgICAgICAgIFwiNjI1MzUwNjU3ODI5ODk2MjI0XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBDaXJjdXMsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly95b3V0dS5iZS9FSnRiNnotZGxUOD90PTE0NVwiXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUm91dGVzID0ge1xyXG4gICAgYmFkZ2VzOiBgL3VzZXJzL2JhZGdlc2BcclxufSIsIi8qKlxyXG4gKiBDb3B5cmlnaHQgMjAxOCBaYWNoYXJ5IFJhdWVuXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xyXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcclxuICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcclxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZFxyXG4gKiB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsXHJcbiAqIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBXHJcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcclxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GXHJcbiAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRVxyXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cclxuICogXHJcbiAqIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JEUGx1Z2luTGlicmFyeVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlXHJcbiAqIEBuYW1lIE9mZnNldFxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVG9wIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBMZWZ0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBPdXRlciB3aWR0aCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqL1xyXG5cclxuIC8qKlxyXG4gKiBGdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyBhZGRlZCBsaXN0ZW5lci5cclxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxyXG4gKi9cclxuIFxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQWRkcyBhIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBhcyB0aGUgZWxlbWVudCBpZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTdHlsZShpZCwgY3NzKSB7XHJcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTdHlsZShpZCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcy9yZXF1aXJlcyBhIHJlbW90ZSBzY3JpcHQgdG8gYmUgbG9hZGVkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgZm9yIHRoaXMgc2NyaXB0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2NyaXB0IGlzIGxvYWRlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG5cdFx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcclxuXHRcdFx0c2NyaXB0LnNyYyA9IHVybDtcclxuXHRcdFx0c2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcclxuXHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoc2NyaXB0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xyXG4gICAgICAgIGlkID0gdGhpcy5lc2NhcGVJRChpZCk7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxyXG4gICAgc3RhdGljIGFuaW1hdGUoe3RpbWluZyA9IF8gPT4gXywgdXBkYXRlLCBkdXJhdGlvbn0pIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICBcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0ZSh0aW1lKSB7XHJcbiAgICAgICAgICAvLyB0aW1lRnJhY3Rpb24gZ29lcyBmcm9tIDAgdG8gMVxyXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uID4gMSkgdGltZUZyYWN0aW9uID0gMTtcclxuICAgICAgXHJcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXHJcbiAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWluZyh0aW1lRnJhY3Rpb24pO1xyXG4gICAgICBcclxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcclxuICAgICAgXHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uIDwgMSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIG15IHNoaXQgdmVyc2lvbiBvZiBub3QgaGF2aW5nIHRvIHVzZSBgJGAgZnJvbSBqUXVlcnkuIE1lYW5pbmdcclxuICAgICAqIHRoYXQgeW91IGNhbiBwYXNzIGEgc2VsZWN0b3IgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4ge0BsaW5rIG1vZHVsZTpET01Ub29scy5xdWVyeX0uXHJcbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5xdWVyeVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBFaXRoZXIgdGhlIHJlc3VsdCBvZiBgcGFyc2VIVE1MYCBvciBgcXVlcnlgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGFyc2VIVE1MKHNlbGVjdG9yKTtcclxuICAgICAgICBjb25zdCBpc0hUTUwgPSBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgPyBBcnJheS5mcm9tKGVsZW1lbnQpLnNvbWUobiA9PiBuLm5vZGVUeXBlID09PSAxKSA6IGVsZW1lbnQubm9kZVR5cGUgPT09IDE7XHJcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnkoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIEFycmF5IG9mIGFsbCBmb3VuZCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnlBbGwoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcclxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxyXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIGlmIHlvdSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50cyBhdCB0aGUgdG9wIGxldmVsLCB0aGV5IGNhbiB0aGVuIGJlIGFwcGVuZGVkIGFsbCBhdCBvbmNlIHRvIGFub3RoZXIgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxyXG4gICAgICogbm9kZXMgYW5kIHRoZXJlIHdlcmUgbXVsdGlwbGUgdG9wIGxldmVsIG5vZGVzLCBvdGhlcndpc2UgdGhlIHNpbmdsZSBub2RlIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gVGhlIHJlc3VsdCBvZiBIVE1MIHBhcnNpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XHJcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGZyYWdtZW50KSByZXR1cm4gbm9kZTtcclxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFsdGVybmF0ZSBuYW1lIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTH0gKi9cclxuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtyZXR1cm4gdGhpcy5wYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQpO31cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHN0cmluZyBvZiBodG1sIGFuZCBlc2NhcGVzIGl0IHVzaW5nIHRoZSBicm93ZXIncyBvd24gZXNjYXBpbmcgbWVjaGFuaXNtLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwgLSBodG1sIHRvIGJlIGVzY2FwZWRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGVzY2FwZUhUTUwoaHRtbCkge1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XHJcbiAgICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICBzcGFuRWxlbWVudC5hcHBlbmQodGV4dE5vZGUpO1xyXG4gICAgICAgIHRleHROb2RlLm5vZGVWYWx1ZSA9IGh0bWw7XHJcbiAgICAgICAgcmV0dXJuIHNwYW5FbGVtZW50LmlubmVySFRNTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byByZW1vdmVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlbW92ZUNsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQ6IFRvZ2dsZSBjbGFzcyB2YWx1ZTtcclxuICAgICAqIGkuZS4sIGlmIGNsYXNzIGV4aXN0cyB0aGVuIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGZhbHNlLCBpZiBub3QsIHRoZW4gYWRkIGl0IGFuZCByZXR1cm4gdHJ1ZS5cclxuICAgICAqIFdoZW4gYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudDpcclxuICAgICAqIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgY2xhc3MgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byB0b2dnbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZGljYXRvcl0gLSBPcHRpb25hbCBpbmRpY2F0b3IgZm9yIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgdG9nZ2xlZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lLCBpbmRpY2F0b3IpIHtcclxuICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZihpbmRpY2F0b3IpICE9PSBcInVuZGVmaW5lZFwiKSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjLCBpbmRpY2F0b3IpKTtcclxuICAgICAgICBlbHNlIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYykuZXZlcnkoYyA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbmUgY2xhc3Mgd2l0aCBhbm90aGVyXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZE5hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHJlcGxhY2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lIC0gTmV3IG5hbWUgZm9yIHRoZSBjbGFzc1xyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVwbGFjZUNsYXNzKGVsZW1lbnQsIG9sZE5hbWUsIG5ld05hbWUpIHtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZXBsYWNlKG9sZE5hbWUsIG5ld05hbWUpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIGFwcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgYXBwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhcHBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLmFwcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBwcmVwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBwcmVwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmVwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5wcmVwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5pbnNlcnRBZnRlcihvdGhlckVsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5zZXJ0QWZ0ZXIodGhpc05vZGUsIHRhcmdldE5vZGUpIHtcclxuICAgICAgICB0YXJnZXROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXNOb2RlLCB0YXJnZXROb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5hZnRlcihuZXdFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFmdGVyKHRoaXNOb2RlLCBuZXdOb2RlKSB7XHJcbiAgICAgICAgdGhpc05vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgdGhpc05vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5leHQgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgbmV4dCBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiKyBcIiArIHNlbGVjdG9yKSA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc3Vic2VxdWVudCBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG5leHQgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dEFsbChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIn4gKlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN1YnNlcXVlbnQgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dFVudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0LnB1c2goZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSByZXR1cm4gcHJldmlvdXMgJiYgcHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikgPyBwcmV2aW91cyA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgcHJlY2VlZGluZyBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgd2hpY2ggaW5kZXggaW4gY2hpbGRyZW4gYSBjZXJ0YWluIG5vZGUgaXMuIFNpbWlsYXIgdG8galF1ZXJ5J3MgYCQuaW5kZXgoKWBcclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB0byBmaW5kIGl0cyBpbmRleCBpbiBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBub2RlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbmRleEluUGFyZW50KG5vZGUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGxldCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMuaW5kZXhJblBhcmVudH0gKi9cclxuICAgIHN0YXRpYyBpbmRleChub2RlKSB7cmV0dXJuIHRoaXMuaW5kZXhJblBhcmVudChub2RlKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgaWYgaXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcGFyZW50IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIHNpYmxpbmcgZWxlbWVudCBvciBudWxsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuICFzZWxlY3RvciB8fCBlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikgPyBlbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBhbmNlc3RvcnMgb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBwYXJlbnRzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHBhcmVudHMgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSk7XHJcbiAgICAgICAgZWxzZSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcnMgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBhbmNlc3RvcnMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzaWJsaW5ncyBvZiB0aGUgZWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIipcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgc2libGluZ3MgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2libGluZ3MoZWxlbWVudCwgc2VsZWN0b3IgPSBcIipcIikge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGUgPT4gZSAhPSBlbGVtZW50ICYmIGUubWF0Y2hlcyhzZWxlY3RvcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIGNzcyBzdHlsZXMgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBzdHlsZSBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3R5bGUuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBBdHRyaWJ1dGUgdG8gZ2V0IG9yIHNldFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBWYWx1ZSB0byBzZXQgZm9yIGF0dHJpYnV0ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNzcyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIHdpZHRoIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgd2lkdGggYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHdpZHRoLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFdpZHRoIHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpZHRoKGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkud2lkdGgpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgaGVpZ2h0IGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgaGVpZ2h0IGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBoZWlnaHQuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSGVpZ2h0IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhlaWdodChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGlubmVyIHRleHQgb2YgYW4gZWxlbWVudCBpZiBnaXZlbiBhIHZhbHVlLCBvdGhlcndpc2UgcmV0dXJucyBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSB0ZXh0IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gQ29udGVudCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRWl0aGVyIHRoZSBzdHJpbmcgc2V0IGJ5IHRoaXMgY2FsbCBvciB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0ZXh0KGVsZW1lbnQsIHRleHQpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRleHQpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50O1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYWdlLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgb2Zmc2V0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtPZmZzZXR9IC0gVGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2Zmc2V0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxpc3RlbmVycygpIHsgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9uYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgb25jZS5cclxuICAgICAqIGBjb25zdCBjYW5jZWwgPSBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImZpcmVkIVwiKTsgY2FuY2VsKCk7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb25hbGl0eSBmb3IgdGhpcyBtZXRob2QgbWF0Y2hlcyB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9ufSBidXQgYXV0b21hdGljYWxseSBjYW5jZWxzIGl0c2VsZlxyXG4gICAgICogYW5kIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHVwb24gdGhlIGZpcnN0IGZpcmluZyBvZiB0aGUgZGVzaXJlZCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25jZShlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfSA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBfX29mZkFsbChldmVudCwgZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGxldCBtYXRjaEZpbHRlciA9IGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09IHR5cGUsIGRlZmF1bHRGaWx0ZXIgPSBfID0+IF87XHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIG1hdGNoRmlsdGVyID0gbCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQsIGRlZmF1bHRGaWx0ZXIgPSBsID0+IGwuZWxlbWVudCA9PSBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gfHwgW107XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPyBsaXN0ZW5lcnMuZmlsdGVyKG1hdGNoRmlsdGVyKSA6IGxpc3RlbmVycy5maWx0ZXIoZGVmYXVsdEZpbHRlcik7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBsaXN0Lmxlbmd0aDsgYysrKSBsaXN0W2NdLmNhbmNlbCgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb2ZmYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlZCB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiY2xpY2subXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhFbGVtZW50fHN0cmluZyl9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbW92ZSBsaXN0ZW5lciBmcm9tXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50XSAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IFtkZWxlZ2F0ZV0gLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgb3JpZ2luYWwgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihlbGVtZW50KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5fX29mZkFsbChlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSByZXR1cm4gdGhpcy5fX29mZkFsbChldmVudCwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciB3aGVuIHRoZSBub2RlIGlzIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keS5cclxuICAgICAqIFRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgdXBvbiBmaXJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gbm9kZSB0byB3YWl0IGZvclxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZXZlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb25Nb3VudCAtIGRldGVybWluZXMgaWYgaXQgc2hvdWxkIGZpcmUgb24gTW91bnQgb3Igb24gVW5tb3VudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgb25Nb3VudCA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjaywgbXV0YXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20ob25Nb3VudCA/IG11dGF0aW9uLmFkZGVkTm9kZXMgOiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2g7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgdHJ1ZWAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgZmFsc2VgICovXHJcbiAgICBzdGF0aWMgb25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uQWRkZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudChub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Vbm1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vblVubW91bnQobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbWJpbmVzIG11bHRpcGxlIGVsZW1lbnRzIGludG8gb25lIHBhcmVudCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBhcnJheSBvZiBlbGVtZW50cyB0byBwdXQgaW50byBhIHNpbmdsZSBwYXJlbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdyYXAoZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBkb21XcmFwcGVyID0gdGhpcy5wYXJzZUhUTUwoYDxkaXYgY2xhc3M9XCJkb20td3JhcHBlclwiPjwvZGl2PmApO1xyXG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIGRvbVdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudHNbZV0pO1xyXG4gICAgICAgIHJldHVybiBkb21XcmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzb2x2ZXMgdGhlIG5vZGUgdG8gYW4gSFRNTEVsZW1lbnQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgbGlicmFyeSBtb2R1bGVzLlxyXG4gICAgICogQHBhcmFtIHsoalF1ZXJ5fEVsZW1lbnQpfSBub2RlIC0gbm9kZSB0byByZXNvbHZlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXNvbHZlRWxlbWVudChub2RlKSB7XHJcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgIH1cclxufVxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRPTSA9IERPTVRvb2xzIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBFbW9qaVJlZ2V4OiAvPGE/XFwuKFxcdyspXFwuKFxcZCspPi9nXHJcbn1cclxuXHJcbmxldCBDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxyXG5sZXQgRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbmxldCBBdXRvY29tcGxldGVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilbMF1cclxubGV0IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylbMF1cclxubGV0IEVtb2ppTW9kdWxlUXVlcnkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylbMF1cclxubGV0IE1lc3NhZ2VzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVswXVxyXG5sZXQgZ3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylbMF1cclxubGV0IGVtb2ppU2VhcmNoID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW9qaU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuaW5pdCgpLmNhdGNoKGVyciA9PiBVdGlscy5lcnIoXCJFbW9qaU1vZHVsZVwiLCBcIkFuIGVycm9yIG9jY3VyZWRcIiwgZXJyKSkgLy8gYmV0dGVyIGxvZ2dpbmdcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgLyoqIEVtb2ppIEF1dG9Db21wbGV0ZSAqL1xyXG4gICAgICAgIGlmKCFBdXRvY29tcGxldGVNb2R1bGUpQXV0b2NvbXBsZXRlTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVxyXG4gICAgICAgIGlmKCFBdXRvQ29tcGxldGlvblRlbXBsYXRlcylBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVxyXG4gICAgICAgIGlmKCFFbW9qaU1vZHVsZVF1ZXJ5KUVtb2ppTW9kdWxlUXVlcnkgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpXHJcbiAgICAgICAgaWYoIU1lc3NhZ2VzKU1lc3NhZ2VzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylcclxuICAgICAgICBpZighZ3VpbGRNb2R1bGUpZ3VpbGRNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpXHJcbiAgICAgICAgaWYoIWVtb2ppU2VhcmNoKWVtb2ppU2VhcmNoID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcblxyXG4gICAgICAgIGlmKEF1dG9jb21wbGV0ZU1vZHVsZSAmJiBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyAmJiBFbW9qaU1vZHVsZVF1ZXJ5ICYmIE1lc3NhZ2VzICYmIGd1aWxkTW9kdWxlICYmIGVtb2ppU2VhcmNoKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcclxuICAgICAgICAgICAgY29uc3QgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnNcclxuICAgICAgICAgICAgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IGZ1bmN0aW9uKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgdmFsdWUuTElHSFRDT1JEX0VNT0pJUyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKGFyZzEsIGFyZzIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIFwiLlwiID09PSBhcmcxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVtb2ppVXNhYmxlKGNvbmRpdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHRzKHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IEVtb2ppTW9kdWxlUXVlcnkuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cyh0LCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUmVzdWx0cyhlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoZSwgdCwgYS5lbW9qaXMsIG4sIHIsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSkksIEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LkVtb2ppLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaTogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQgfHwgZS51bmlxdWVOYW1lIHx8IGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbDogXCIuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbGQ6IG51bGwgIT0gZS5ndWlsZElkID8gZ3VpbGRNb2R1bGUuZGVmYXVsdC5nZXRHdWlsZChlLmd1aWxkSWQpIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIi5cIiArIGUgKyBcIi5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFBsYWluVGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRSYXdUZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IHN0YXJ0IGF1dG9jb21wbGV0aW9uIG9mIExpZ2h0Y29yZCdzIGVtb2ppcy5cIikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogRW1vamkgZGlzcGxheSAqL1xyXG4gICAgICAgIHdoaWxlICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW9qaVJlbmRlcil7IC8vIFRPRE86IFByb3BlciBlbW9qaSBmb3JtYXR0aW5nIC8gcmVuZGVyaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlXCIpXHJcbiAgICAgICAgICAgICAgICBpZighbWVzc2FnZSlyZXR1cm5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIWNvbnRlbnQgfHwgIWNvbnRlbnQubGVuZ3RoKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHt7XHJcbiAgICAgICAgICAgICAgICAgKiAgcmF3OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgYW5pbWF0ZWQ6IGJvb2xlYW5cclxuICAgICAgICAgICAgICAgICAqIH1bXX1cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtb2ppcyA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBub2RlIG9mIGNvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNQYXJzZWQgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gQ29uc3RhbnRzLkVtb2ppUmVnZXguZXhlYyhub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFyc2VkID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUVtb2ppTW9kdWxlQXBpKUVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBFbW9qaU1vZHVsZUFwaS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZChwYXJzZWRbMl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbW9qaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVtb2ppLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogcGFyc2VkWzBdLnN0YXJ0c1dpdGgoXCI8YVwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyc2VkWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkWzJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChwYXJzZWQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzUGFyc2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBub2RlLnNwbGl0KFwiIFwiKS5tYXAoKHdvcmQsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF3b3JkKXJldHVybiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IGVtb2ppcy5maW5kKGUgPT4gZS5yYXcgPT0gd29yZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbW9qaSlyZXR1cm4gd29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUN1c3RvbUVtb2ppTW9kdWxlKUN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDdXN0b21FbW9qaU1vZHVsZS5DdXN0b21FbW9qaSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAuJHtlbW9qaS5uYW1lfS5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaUlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGVtb2ppLmFuaW1hdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1ib2FibGU6IGFyci5sZW5ndGggPT09IDEgJiYgY29udGVudC5sZW5ndGggPT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmV2aW91cy5sZW5ndGggPT09IDApcmV0dXJuIFtjdXJyZW50XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdICs9IGAgJHtjdXJyZW50fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIrY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIsIGN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCguLi53b3JkcylcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQuc2hpZnQoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUobmV3Q29udGVudFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnB1c2gobmV3Q29udGVudC5zaGlmdCgpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlcigpO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICAgICAgXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEQoZSwgdCwgbiwgciwgbywgaSwgcywgdSwgbCwgYykge1xyXG4gICAgaWYgKG51bGwgPT0gbiB8fCAwID09PSBuLmxlbmd0aCkgcmV0dXJuIG51bGw7XHJcbiAgICB2YXIgZCA9IG4ubWFwKChmdW5jdGlvbihlLCBuKSB7XHJcbiAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQodSwgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgIG9uQ2xpY2s6IG8sXHJcbiAgICAgICAgICAgIG9uSG92ZXI6IHIsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0ID09PSBuLFxyXG4gICAgICAgICAgICBpbmRleDogblxyXG4gICAgICAgIH0sIGwoZSwgbikpKVxyXG4gICAgfSkpO1xyXG4gICAgcmV0dXJuIFtSKGksIHMsIGUsIGMpLCBkXVxyXG59XHJcblxyXG5mdW5jdGlvbiBSKGUsIHQsIG4sIHIpIHtcclxuICAgIHZhciBhID0gKG4ubGVuZ3RoID4gMCA/IGUuZm9ybWF0KHtcclxuICAgICAgICBwcmVmaXg6IHIobilcclxuICAgIH0pIDogdClcclxuICAgIGlmKEFycmF5LmlzQXJyYXkoYSkpe1xyXG4gICAgICAgIGEudW5zaGlmdChSZWFjdC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIsIHt9LCBcIltMaWdodGNvcmRdIFwiKSlcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGEgPSBcIltMSUdIVENPUkRdIFwiK2FcclxuICAgIH1cclxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LlRpdGxlLCB7XHJcbiAgICAgICAgdGl0bGU6IGFcclxuICAgIH0sIGEpXHJcbn1cclxuUi5kaXNwbGF5TmFtZSA9IFwicmVuZGVySGVhZGVyXCI7XHJcblxyXG5sZXQgRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbmxldCBpc0Vtb2ppRGlzYWJsZWQgPSBFbW9qaUZpbHRlck1vZHVsZSAmJiBFbW9qaUZpbHRlck1vZHVsZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZFxyXG5sZXQgaXNVc2FibGUgPSBmYWxzZVxyXG5sZXQgaGFzUGF0Y2hlZCA9IGZhbHNlXHJcblxyXG5mdW5jdGlvbiBzZXRFbW9qaVVzYWJsZSh1c2FibGUpe1xyXG4gICAgaXNVc2FibGUgPSB1c2FibGVcclxuICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpRW1vamlGaWx0ZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQpWzBdXHJcbiAgICBpZighRW1vamlGaWx0ZXJNb2R1bGUpcmV0dXJuXHJcbiAgICBpZighaXNFbW9qaURpc2FibGVkKWlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcblxyXG4gICAgaGFzUGF0Y2hlZCA9IHRydWVcclxuICAgIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkID0gZnVuY3Rpb24oZW1vamkpe1xyXG4gICAgICAgIGlmKGlzVXNhYmxlKXtcclxuICAgICAgICAgICAgaWYoZW1vamkuc3Vycm9nYXRlcyB8fCBlbW9qaS5kaXZlcnNpdHkpcmV0dXJuIHRydWVcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBpc0Vtb2ppRGlzYWJsZWQuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgbm9kZUZldGNoIGZyb20gXCJub2RlLWZldGNoXCJcclxuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIlxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiXHJcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5pbXBvcnQgeyBjcmVhdGVSZWFkU3RyZWFtLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgYmFzZW5hbWUsIGpvaW4gfSBmcm9tIFwicGF0aFwiXHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiXHJcbmltcG9ydCB7IGFkZG9uQ2FjaGUgfSBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiXHJcblxyXG5jb25zdCBjYWNoZSA9IHt9XHJcbmNvbnN0IGNhY2hlMiA9IHt9XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgUGx1Z2luQ2VydGlmaWVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlBsdWdpbkNlcnRpZmllciA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaChhdHRhY2htZW50LCBpZCl7XHJcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKXtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaXNUcnVzdGVkKGhhc2gpe1xyXG4gICAgICAgIHJldHVybiBjYWNoZVtoYXNoXSAmJiAhY2FjaGVbaGFzaF0uc3VzcGVjdFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tWaXJ1c2VzKGhhc2gsIGRhdGEsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjaywgZmlsZW5hbWUpe1xyXG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpXHJcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcclxuICAgIGZvcihsZXQga2V5d29yZCBvZiBkYXRhLnNwbGl0KC9bXlxcd1xcZF0rL2cpKXtcclxuICAgICAgICBmb3IobGV0IG9vZiBvZiBbXHJcbiAgICAgICAgICAgIFwidG9rZW5cIixcclxuICAgICAgICAgICAgXCJlbWFpbFwiLFxyXG4gICAgICAgICAgICBcInBob25lXCIsXHJcbiAgICAgICAgICAgIFwiTUZBXCIsXHJcbiAgICAgICAgICAgIFwiMmZhXCIsXHJcbiAgICAgICAgICAgIFwicHJvY2Vzc1wiLFxyXG4gICAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJldmFsXCIsXHJcbiAgICAgICAgICAgIFwiZ2V0R2xvYmFsXCIsXHJcbiAgICAgICAgICAgIFwiQnJvd3NlcldpbmRvd1wiXHJcbiAgICAgICAgXSl7XHJcbiAgICAgICAgICAgIGlmKGtleXdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhvb2YudG9Mb3dlckNhc2UoKSkpe1xyXG4gICAgICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJ0b2tlbiBzdGVhbGVyL3ZpcnVzXCJcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgbm9fY29tbWVudHMgPSBkYXRhLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98KFteXFxcXDpdfF4pXFwvXFwvLiokL2dtLCBcIlwiKS50cmltKCkvLyByZW1vdmluZyB0aGUgTUVUQSBjb21tZW50IGZyb20gcGx1Z2luc1xyXG4gICAgICAgIGlmKCgvdmFyIFtcXHdcXGRfJF0rPVxcW1wiL2dpKS50ZXN0KG5vX2NvbW1lbnRzKSl7XHJcbiAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4cHMgPSBbXHJcbiAgICAgICAgICAgICAgICAvKiogaGV4YWRlY2ltYWwgKi9cclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIF8weDhkYjcoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgICAgIC8qKiBtYW5nbGVkICovXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydcXCkvZywgLy8gYignMHgwJylcclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIGIoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBmb3IobGV0IHJlZ2V4IG9mIHJlZ2V4cHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSByZWdleC50ZXN0KG5vX2NvbW1lbnRzKSA/IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIiA6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bClyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcclxuICAgIGNhY2hlW2hhc2hdID0ge1xyXG4gICAgICAgIHN1c3BlY3Q6IHRydWUsXHJcbiAgICAgICAgbmFtZTogaGFzaFRvVXJsW2hhc2hdLnNwbGl0KFwiL1wiKS5wb3AoKSxcclxuICAgICAgICB0eXBlOiBoYXNoVG9VcmxbaGFzaF0uZW5kc1dpdGgoXCIuanNcIikgPyBcIlBsdWdpblwiIDogXCJUaGVtZVwiLFxyXG4gICAgICAgIGhhcm06IGlzSGFybWZ1bCxcclxuICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgIGZpbGVuYW1lXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGBGb3VuZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgJHtjYWNoZVtoYXNoXS50eXBlLnRvTG93ZXJDYXNlKCl9OiAke2NhY2hlW2hhc2hdLm5hbWV9YClcclxuXHJcbiAgICByZXN1bHRDYWxsYmFjayhjYWNoZVtoYXNoXSlcclxufVxyXG5cclxuY29uc3QgaGFzaFRvVXJsID0ge31cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0hhc2goaGFzaCwgZGF0YSwgZmlsZW5hbWUsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayl7XHJcbiAgICBjb25zb2xlLmxvZyhgRmlsZTogJHtmaWxlbmFtZX0gaGFzaDogJHtoYXNofWApXHJcbiAgICBpZighY2FjaGVbaGFzaF0pe1xyXG4gICAgICAgIG5vZGVGZXRjaChcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9MaWdodGNvcmQvZmlsZWhhc2hlc0BtYXN0ZXIvaGFzaGVzL1wiK2hhc2gsIHsgLy8gVXNpbmcgbm9kZS1mZXRjaCB0byBieXBhc3MgY29yc1xyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnVzZXJBZ2VudCAvLyBoYXZlIHRvIHNldCB1c2VyLWFnZW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBpZihmaWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKGhhc2gpXHJcbiAgICAgICAgICAgICAgICBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrLCBmaWxlbmFtZSlcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgcmVzdWx0Lmhhc2ggPSBoYXNoXHJcbiAgICAgICAgICAgIHJlc3VsdC5maWxlbmFtZSA9IGZpbGVuYW1lXHJcblxyXG4gICAgICAgICAgICBjYWNoZVtoYXNoXSA9IHJlc3VsdFxyXG5cclxuICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgICAgIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBjYWNoZVtoYXNoXVxyXG5cclxuICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZShfX3BhdGgsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayA9IChoYXNoKSA9PiB7fSwgaXNGcm9tTG9hZGVyID0gZmFsc2UpeyAgICBcclxuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKVxyXG4gICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuXHJcbiAgICBjcmVhdGVSZWFkU3RyZWFtKF9fcGF0aCkub24oXCJkYXRhXCIsIGNodW5rID0+IHtcclxuICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgfSkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKVxyXG5cclxuICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBfX3BhdGhcclxuXHJcbiAgICAgICAgaWYoaXNGcm9tTG9hZGVyICYmIGFkZG9uQ2FjaGVbaGFzaFJlc3VsdF0pe1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXHJcbiAgICAgICAgICAgIGlmKHZhbHVlLnRpbWVzdGFtcCA8IChEYXRlLm5vdygpIC0gNi4wNDhlKzgpKXtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdXHJcbiAgICAgICAgICAgICAgICBjb250ZW50TWFuYWdlci5zYXZlQWRkb25DYWNoZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0Q2FsbGJhY2sodmFsdWUucmVzdWx0KVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNoZWNrSGFzaChoYXNoUmVzdWx0LCBkYXRhLCBiYXNlbmFtZShfX3BhdGgpLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spXHJcbiAgICB9KVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpe1xyXG4gICAgaWYoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlyZXR1cm5cclxuICAgIGlmKCFhdHRhY2htZW50LnVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuICAgIGlmKCFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSAmJiAhYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5yZW1vdmUoKVxyXG5cclxuICAgIG5vZGVGZXRjaChhdHRhY2htZW50LnVybCwge1xyXG4gICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcclxuICAgICAgICB9XHJcbiAgICB9KS50aGVuKHJlcyA9PiB7XHJcbiAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIkZpbGUgZG9lc24ndCBleGlzdC5cIilcclxuICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgICAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBjaHVua10pXHJcbiAgICAgICAgICAgIGhhc2gudXBkYXRlKGNodW5rKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcmVzLmJvZHkub24oXCJlbmRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgICAgIGNhY2hlMlthdHRhY2htZW50LnVybF0gPSBoYXNoUmVzdWx0XHJcbiAgICAgICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IGF0dGFjaG1lbnQudXJsXHJcblxyXG4gICAgICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYXR0YWNobWVudC5maWxlbmFtZSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhpZCwgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICB9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgICAgICAgICAgICAgaWYoZWxlbSllbGVtLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pLmNhdGNoKCgpPT57fSlcclxufVxyXG5cclxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgZmlsZW5hbWUpe1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXHJcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxyXG5cclxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcbiAgICBcclxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFxyXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Ryb24ucmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChjaGlsZC5ocmVmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1zdGF0dXMtZG5kKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZSBpZighcmVzdWx0Lm9mZmljaWFsKXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgbGV0IHNwYW4gPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtzdHlsZToge2Rpc3BsYXk6IFwiaW5oZXJpdFwifX0sIFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiM0ZjU0NWNcIiwgXCJmaWxsLXJ1bGVcIjpcImV2ZW5vZGRcIixkOlwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwifSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lcn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1wiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBpbnN0YWxsIGFuZCBsYXVuY2ggdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkby5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIGFuZCBJbnN0YWxsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkkndmUgY2hhbmdlZCBteSBtaW5kXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYW5nZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmsgPSBnZXRLZXllZEFycmF5KGNhY2hlMikuZmluZChlID0+IGVbMV0gPT09IHJlc3VsdC5oYXNoKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGluc3RhbGxQYXRoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIHdhcyBtYWRlIGJ5IHRoZSBkZXZlbG9wZXJzIG9mIExpZ2h0Y29yZC5cIiwgc3R5bGU6XCJicmFuZFwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIiwgZmxvYXQ6IFwibGVmdFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiY3VycmVudENvbG9yXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTEwLjcsNS4yOGEyLjksMi45LDAsMCwwLTIuMTEuODYuMTEuMTEsMCwwLDAsMCwuMTZsMS4wNS45NGEuMTEuMTEsMCwwLDAsLjE1LDAsMS4yNywxLjI3LDAsMCwxLC45LS4zM2MuNjUsMCwuNjUuNzMuNjUuNzNhLjY0LjY0LDAsMCwxLS42NS42NSwxLjczLDEuNzMsMCwwLDEtMS4xOC0uNTRjLS4zMS0uMjYtLjM2LS4zMi0uNzMtLjY2UzcuMDYsNS4yOCw1LjY1LDUuMjhBMi4yNiwyLjI2LDAsMCwwLDMuMzcsNy41NiwyLjU5LDIuNTksMCwwLDAsMy44Miw5YTIuMTgsMi4xOCwwLDAsMCwxLjgzLjg5LDIuOTQsMi45NCwwLDAsMCwyLjEtLjgxLjExLjExLDAsMCwwLDAtLjE2TDYuNzQsOEEuMTEuMTEsMCwwLDAsNi42LDhhMS41OCwxLjU4LDAsMCwxLS45NC4yOWgwQS43MS43MSwwLDAsMSw1LDcuNTZINWEuNjMuNjMsMCwwLDEsLjY1LS42NGMuNzEsMCwxLjQyLjc1LDEuOTQsMS4yNy43NS43NiwxLjY2LDEuNzksMy4xMSwxLjc0QTIuMjgsMi4yOCwwLDAsMCwxMyw3LjY0YTIuNTksMi41OSwwLDAsMC0uNDUtMS40N0EyLjE0LDIuMTQsMCwwLDAsMTAuNyw1LjI4WlwifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogXCJJbnN0YWxsIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiBvbiBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifSwgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTGlnaHRjb3JkIHdpbGwgYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgbG9hZCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIuIFlvdSBtdXN0IGVuYWJsZSBpdCBpbiB0aGUgc2V0dGluZ3MuXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmV0Y2gobGluaylcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgbmV3IEVycm9yKFwiU3RhdHVzIHdhcyBub3QgMjAwXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gYXdhaXQgcmVzLmJ1ZmZlcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnN0YWxsUGF0aCA9IGpvaW4ocmVzdWx0LnR5cGUgPT09IFwiUGx1Z2luXCIgPyBjb250ZW50TWFuYWdlci5fcGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLl90aGVtZXNGb2xkZXIsIHJlc3VsdC5maWxlbmFtZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRmlsZVN5bmMoaW5zdGFsbFBhdGgsIGNvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChyZXN1bHQudHlwZStcIiBzdWNjZXNmdWxseSBpbnN0YWxsZWQuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIgOiBuZXcgRXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoZXJyLm1lc3NhZ2UsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZXJyb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDI0IDI0XCIsc3R5bGU6e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJyZ2IoNjcsIDE4MSwgMTI5KVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxnIGZpbGw9XCJub25lXCIgZmlsbC1ydWxlPVwiZXZlbm9kZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBjbGFzcz1cImZpbGxcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgXSlcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzcGFuLCBkaXYpXHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGdldEtleWVkQXJyYXkob2JqKXtcclxuICAgIGxldCBhcnIgPSBbXVxyXG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGsgPT4ge1xyXG4gICAgICAgIGFyci5wdXNoKFtrLCBvYmpba11dKVxyXG4gICAgfSlcclxuICAgIHJldHVybiBhcnJcclxufVxyXG5cclxubGV0IGtleSA9IG51bGxcclxubGV0IHNhdmUgPSBudWxsXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChtPT5tLk9iamVjdFN0b3JhZ2UpXHJcbi50aGVuKGxvY2FsU3RvcmFnZU1vZHVsZSA9PiB7XHJcbiAgICBsZXQgbG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlTW9kdWxlLmltcGxcclxuICAgIHNhdmUgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXQoXCJQbHVnaW5DZXJ0aWZpZXJLZXlFbmNyeXB0aW9uX19cIiwgYnRvYShKU09OLnN0cmluZ2lmeShrZXkpKSlcclxuICAgIH1cclxuICAgIHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICBzYXZlKClcclxuICAgIH0sIDEwMDAwMCk7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgbGV0IHZhbCA9IHNhZmVKU09OUGFyc2UoYXRvYihsb2NhbFN0b3JhZ2UuZ2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIpKSlcclxuICAgICAgICBpZih2YWwgaW5zdGFuY2VvZiBFcnJvciB8fCAhQXJyYXkuaXNBcnJheSh2YWwpIHx8IHZhbC5sZW5ndGggIT09IDIgfHwgdmFsLmZpbmQoZSA9PiB0eXBlb2YgZSAhPT0gXCJzdHJpbmdcIikgfHwgQnVmZmVyLmZyb20odmFsWzBdLCBcImJhc2U2NFwiKS5sZW5ndGggIT09IDE2IHx8IEJ1ZmZlci5mcm9tKHZhbFsxXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAzMil7XHJcbiAgICAgICAgICAgIGdlbmVyYXRlS2V5KClcclxuICAgICAgICAgICAgc2F2ZSgpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICBrZXkgPSB2YWxcclxuICAgIH1jYXRjaChlKXtcclxuICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9XHJcbn0pXHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUtleSgpe1xyXG4gICAga2V5ID0gW2NyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoXCJiYXNlNjRcIiksIGNyeXB0by5yYW5kb21CeXRlcygzMikudG9TdHJpbmcoXCJiYXNlNjRcIildXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNhZmVKU09OUGFyc2UoanNvbil7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvbilcclxuICAgIH1jYXRjaChlKXtcclxuICAgICAgICByZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yID8gbmV3IEVycm9yKGUpIDogZVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGVjcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICB0cnl7XHJcbiAgICAgICAgbGV0IGRlY2lwaGVyID0gY3J5cHRvLmNyZWF0ZURlY2lwaGVyaXYoXCJhZXMtMjU2LWNiY1wiLCBCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpKVxyXG4gICAgICAgIGxldCBkZWNyeXB0ZWQgPSBkZWNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJiYXNlNjRcIikpO1xyXG4gICAgICAgIGRlY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2RlY3J5cHRlZCwgZGVjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgICAgIHJldHVybiBkZWNyeXB0ZWQudG9TdHJpbmcoXCJ1dGY4XCIpXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIFwie31cIlxyXG4gICAgfVxyXG59XHJcbmV4cG9ydCBmdW5jdGlvbiBlbmNyeXB0U2V0dGluZ3NDYWNoZShkYXRhKXtcclxuICAgIGxldCBhcmdzID0gW0J1ZmZlci5mcm9tKGtleVsxXSwgXCJiYXNlNjRcIiksIEJ1ZmZlci5mcm9tKGtleVswXSwgXCJiYXNlNjRcIildXHJcbiAgICBcclxuICAgIGxldCBjaXBoZXIgPSBjcnlwdG8uY3JlYXRlQ2lwaGVyaXYoJ2Flcy0yNTYtY2JjJywgLi4uYXJncyk7XHJcbiAgICBsZXQgZW5jcnlwdGVkID0gY2lwaGVyLnVwZGF0ZShCdWZmZXIuZnJvbShkYXRhLCBcInV0ZjhcIikpO1xyXG4gICAgZW5jcnlwdGVkID0gQnVmZmVyLmNvbmNhdChbZW5jcnlwdGVkLCBjaXBoZXIuZmluYWwoKV0pO1xyXG4gICAgcmV0dXJuIGVuY3J5cHRlZC50b1N0cmluZyhcImJhc2U2NFwiKVxyXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNsYXNzIFBsdWdpbk1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5Nb2R1bGUgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cclxufVxyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcclxuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcclxuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuXHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLm9uKFwiZGlkLW5hdmlnYXRlLWluLXBhZ2VcIiwgdGhpcy5jaGFubmVsU3dpdGNoLmJpbmQodGhpcykpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0YXJ0UGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gY291bGQgbm90IGJlIHN0YXJ0ZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgcGx1Z2luICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0b3BQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5zdG9wKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RvcHBlZC5gKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdG9wcGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCkgKyBcIiBjb3VsZCBub3QgYmUgc3RvcHBlZC5cIiwgZXJyKTtcclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZW5hYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xyXG4gICAgcGx1Z2luQ29va2llW3BsdWdpbl0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcclxuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcbiAgICB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHRoaXMuZGlzYWJsZVBsdWdpbihwbHVnaW4pO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVBsdWdpbihwbHVnaW4pO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRDb250ZW50KGZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gKGNvbnNvbGUubG9nKHAuZmlsZW5hbWUsIGZpbGVuYW1lKSkgfHwgcC5maWxlbmFtZSA9PSBmaWxlbmFtZSkucGx1Z2luO1xyXG4gICAgdHJ5IHsgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO31cclxuICAgIGNhdGNoIChlcnIpIHtpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyXX0pO31cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tbG9hZGVkXCIsIHBsdWdpbi5nZXROYW1lKCkpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51bmxvYWRQbHVnaW4gPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBkZWxldGUgYmRwbHVnaW5zW3BsdWdpbl07XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gd2FzIHVubG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tdW5sb2FkZWRcIiwgcGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgdGhpcy51bmxvYWRQbHVnaW4oYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkUGx1Z2luID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xyXG4gICAgY29uc3QgZW5hYmxlZCA9IHBsdWdpbkNvb2tpZVtwbHVnaW5dO1xyXG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3BsdWdpbn0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIGlmIChiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4ubG9hZCAmJiB0eXBlb2YoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQoKTtcclxuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0YXJ0UGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tcmVsb2FkZWRcIiwgcGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkUGx1Z2luKG5hbWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnNvbGUubG9nKFwiRWRpdCBcIiArIGZ1bGxQYXRoKTtcclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiKTtcclxuICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnNhdmVQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInBsdWdpbnNcIiwgcGx1Z2luQ29va2llKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubmV3TWVzc2FnZSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub25NZXNzYWdlID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uTWVzc2FnZSgpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmNoYW5uZWxTd2l0Y2ggPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uU3dpdGNoID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9uU3dpdGNoKCk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yYXdPYnNlcnZlciA9IGZ1bmN0aW9uKGUpIHtcclxuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcclxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW4ub2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub2JzZXJ2ZXIoZSk7IH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFBsdWdpbk1vZHVsZSgpOyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBWMkNfUHVibGljU2VydmVycyBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCBMYXllciBmcm9tIFwiLi4vdWkvcHVibGljc2VydmVycy9sYXllclwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1B1YmxpY1NlcnZlcnMge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuX2FwcGVuZEJ1dHRvbiA9IHRoaXMuX2FwcGVuZEJ1dHRvbi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5WMl9QdWJsaWNTZXJ2ZXJzID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChMYXllciwge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCIsIGlkOiBcInB1YnNsYXllclwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QdWJsaWNTZXJ2ZXJzLCB7cm9vdElkOiBcInB1YnNsYXllcnJvb3RcIn0pKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicHVic2xheWVycm9vdFwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWVMYXllcnNcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllcnMgJiYgZS5sYXllcilbMF0ubGF5ZXJzLnNwbGl0KFwiIFwiKVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBsYXllcnMgPSBET00ucXVlcnkoXCIubGF5ZXJzLCAuXCIrY2xhc3NOYW1lTGF5ZXJzKTtcclxuICAgICAgICBpZiAoIWxheWVycykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGxheWVycy5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoXCI8ZGl2IGlkPSdwdWJzbGF5ZXJyb290Jz5cIikpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyc1wiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvbXBvbmVudCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJ1dHRvbigpIHtcclxuICAgICAgICBjb25zdCBidG4gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXB1Yi1saVwiIGNsYXNzPVwiJHtCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbX1cIj5gKTtcclxuICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWdzLTFcIl0pIGJ0bi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XHJcbiAgICAgICAgY29uc3QgbGFiZWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXB1Yi1idXR0b25cIiBjbGFzcz1cIiR7XCJ3cmFwcGVyLTI1ZVZJbiBcIiArIEJEVjIuZ3VpbGRDbGFzc2VzLmNpcmNsZUJ1dHRvbk1hc2t9XCI+cHVibGljPC9kaXY+YCk7XHJcbiAgICAgICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHt0aGlzLnJlbmRlcigpO30pO1xyXG4gICAgICAgIGJ0bi5hcHBlbmQobGFiZWwpO1xyXG4gICAgICAgIHJldHVybiBidG47XHJcbiAgICB9XHJcblxyXG4gICAgX2FwcGVuZEJ1dHRvbigpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lclxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIFV0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRvd25sb2FkUHJvZ3Jlc3MgJiYgZS50dXRvcmlhbENvbnRhaW5lcilbMF0udHV0b3JpYWxDb250YWluZXIpXHJcbiAgICAgICAgXVxyXG4gICAgICAgIGlmIChET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gRE9NLnF1ZXJ5KGBkaXYuJHtjbGFzc05hbWV0dXRvcmlhbENvbnRhaW5lcn0gPiBkaXZgKTtcclxuICAgICAgICBET00uYWZ0ZXIoZ3VpbGRzLCB0aGlzLmJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQnV0dG9uKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmd1aWxkUGF0Y2gpIHJldHVybjtcclxuICAgICAgICBjb25zdCBHdWlsZExpc3QgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSA9PSBcIk5hdmlnYWJsZUd1aWxkc1wiKTtcclxuICAgICAgICBjb25zdCBHdWlsZExpc3RPbGQgPSB3ZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkd1aWxkc1wiKTtcclxuICAgICAgICBpZiAoIUd1aWxkTGlzdCAmJiAhR3VpbGRMaXN0T2xkKSBVdGlscy53YXJuKFwiUHVibGljU2VydmVyXCIsIFwiQ2FuJ3QgZmluZCBHdWlsZExpc3QgY29tcG9uZW50XCIpO1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkTGlzdCA/IEd1aWxkTGlzdCA6IEd1aWxkTGlzdE9sZC5wcm90b3R5cGUsIEd1aWxkTGlzdCA/IFwiZGVmYXVsdFwiIDogXCJyZW5kZXJcIiwge2FmdGVyOiB0aGlzLl9hcHBlbmRCdXR0b259KTtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24oKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVCdXR0b24oKSB7XHJcbiAgICAgICAgdGhpcy5ndWlsZFBhdGNoKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMuZ3VpbGRQYXRjaDtcclxuICAgICAgICBET00ucXVlcnkoXCIjYmQtcHViLWxpXCIpLnJlbW92ZSgpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7c2V0dGluZ3MsIHNldHRpbmdzQ29va2llLCBzZXR0aW5nc1JQQ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIgZnJvbSBcIi4vc2V0dGluZ3NQYW5lbFNpZGViYXJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgY29sb3JlZFRleHQgZnJvbSBcIi4vY29sb3JlZFRleHRcIjtcclxuaW1wb3J0IHRmSG91ciBmcm9tIFwiLi8yNGhvdXJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IHB1YmxpY1NlcnZlcnNNb2R1bGUgZnJvbSBcIi4vcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgdm9pY2VNb2RlIGZyb20gXCIuL3ZvaWNlTW9kZVwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL2NsYXNzTm9ybWFsaXplclwiO1xyXG5pbXBvcnQgZE1vZGUgZnJvbSBcIi4vZGV2TW9kZVwiO1xyXG5cclxuaW1wb3J0IFNlY3Rpb25lZFNldHRpbmdzUGFuZWwgZnJvbSBcIi4uL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IENzc0VkaXRvciBmcm9tIFwiLi4vdWkvY3NzRWRpdG9yXCI7XHJcbmltcG9ydCBDYXJkTGlzdCBmcm9tIFwiLi4vdWkvYWRkb25saXN0XCI7XHJcbmltcG9ydCBWMkNfUHJlc2VuY2VTZXR0aW5ncyBmcm9tIFwiLi4vdWkvcHJlc2VuY2VTZXR0aW5nc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuL0N1c3RvbVJpY2hQcmVzZW5jZVwiO1xyXG5pbXBvcnQgVjJDX0FjY291bnRJbmZvcyBmcm9tIFwiLi4vdWkvQWNjb3VudEluZm9zXCI7XHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5pbXBvcnQgQW50aUFkRE0gZnJvbSBcIi4vQW50aUFkRE1cIjtcclxuaW1wb3J0IGJsdXJQcml2YXRlIGZyb20gXCIuL2JsdXJQcml2YXRlXCI7XHJcbmltcG9ydCBkaXNhYmxlVHlwaW5nIGZyb20gXCIuL2Rpc2FibGVUeXBpbmdcIjtcclxuaW1wb3J0IEFwaVByZXZpZXcgZnJvbSBcIi4uL3VpL0FwaVByZXZpZXdcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi4vdWkvc3dpdGNoXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4uL3VpL21hcmdpbnRvcFwiO1xyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5pbXBvcnQgSGlzdG9yeSBmcm9tIFwiLi4vdWkvaWNvbnMvaGlzdG9yeVwiO1xyXG5cclxuY2xhc3MgQkRTaWRlYmFySGVhZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2lkZWJhckNvbXBvbmVudHMgPSB3ZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5TZXBhcmF0b3IgJiYgZS5IZWFkZXIgJiYgZS5JdGVtKVxyXG5cclxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dCdXR0b24gPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJDaGFuZ2Vsb2dcIn0sIFxyXG4gICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtmbG9hdDogXCJyaWdodFwiLCBjdXJzb3I6IFwicG9pbnRlclwifSwgY2xhc3NOYW1lOiBcImJkLWNoYW5nZWxvZy1idXR0b25cIiwgb25DbGljazogKCkgPT4ge1V0aWxzLnNob3dDaGFuZ2Vsb2dNb2RhbChiYmRDaGFuZ2Vsb2cpO319LFxyXG4gICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChIaXN0b3J5LCB7Y2xhc3NOYW1lOiBcImJkLWljb25cIiwgc2l6ZTogXCIxNnB4XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVuZGVyZWQgPSBuZXcgc2lkZWJhckNvbXBvbmVudHMuSGVhZGVyKHtcclxuICAgICAgICAgICAgY2hpbGRyZW46IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwsIFwiQmFuZGFnZWQgQkRcIiwgY2hhbmdlbG9nQnV0dG9uKSxcclxuICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJldHVybiByZW5kZXJlZFxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xyXG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsaWdodGNvcmRcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmxpZ2h0Y29yZENvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGNhcGlwcmV2aWV3XCIsIG1ha2VDb21wb25lbnQodGhpcy5BcGlQcmV2aWV3Q29tcG9uZW50LmJpbmQodGhpcykpKVxyXG5cclxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcIkJEQ2hhbmdlbG9nVGl0bGVcIiwgbWFrZUNvbXBvbmVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcclxuICAgICAgICB9KSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjb3JlXCIsIG1ha2VDb21wb25lbnQodGhpcy5jb3JlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInBsdWdpbnNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInBsdWdpbnNcIikpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInRoZW1lc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMucmVuZGVyQWRkb25QYW5lKFwidGhlbWVzXCIpKSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1zZXR0aW5nc3BhbmUtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyLFxyXG4gICAgICAgICAgICBjbGFzc1NpZGViYXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIuc3BsaXQoXCIgXCIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBzaWRlYmFyID0gRE9NLnF1ZXJ5KFwiLlwiK2NsYXNzTmFtZUxheWVyK1wiIC5cIitjbGFzc1NpZGViYXIuc3RhbmRhcmRTaWRlYmFyVmlldy5zcGxpdChcIiBcIilbMF0rXCIsIC5cIitjbGFzc05hbWVMYXllcitcIiAudWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCIpO1xyXG4gICAgICAgIGlmICghc2lkZWJhcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXNldHRpbmdzcGFuZS1jb250YWluZXJcIiBjbGFzcz1cIiR7Y2xhc3NTaWRlYmFyLmNvbnRlbnRSZWdpb259IGNvbnRlbnQtcmVnaW9uXCI+YCk7XHJcbiAgICAgICAgc2lkZWJhci5hcHBlbmQocm9vdCk7XHJcblxyXG4gICAgICAgIFV0aWxzLm9uUmVtb3ZlZChyb290LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShyb290KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29yZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImNvcmVcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaWdodGNvcmRTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJsaWdodGNvcmRcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBQcmVzZW5jZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwic3RhdHVzXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IE1zZ0xvZ1NldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwibXNnbG9nXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2V0dGluZ3MoY2F0ZWdvcnkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ZWdvcnkgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7fVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyhpZCwgY2hlY2tlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU2V0dGluZ3MoaWQsIGVuYWJsZWQpIHtcclxuICAgICAgICBzZXR0aW5nc0Nvb2tpZVtpZF0gPSBlbmFibGVkO1xyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBET00uYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICAgICAgZWxzZSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLnJlbW92ZUJ1dHRvbigpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTRcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgICAgIGVsc2Ugdm9pY2VNb2RlLnN0b3AoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgICAgICBlbHNlIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuYWJsZWQgJiYgaWQgPT0gXCJiZGEtZ3MtNlwiKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy03XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgICAgIGVsc2UgY29sb3JlZFRleHQucmVtb3ZlQ29sb3JlZFRleHQoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstcHMtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSBDbGFzc05vcm1hbGl6ZXIuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy01XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIudW53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXdwLTFcIikge1xyXG4gICAgICAgICAgICBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwidHJhbnNwYXJlbnRcIiwgZW5hYmxlZCk7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBVdGlscy5zZXRXaW5kb3dQcmVmZXJlbmNlKFwiYmFja2dyb3VuZENvbG9yXCIsIG51bGwpO1xyXG4gICAgICAgICAgICBlbHNlIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCIjMmYzMTM2XCIpO1xyXG4gICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy04XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLWRtLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICAgICAgZWxzZSBkTW9kZS5zdG9wQ29weVNlbGVjdG9yKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKmlmIChpZCA9PT0gXCJyZWFjdERldlRvb2xzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSByZWFjdERldlRvb2xzLnN0b3AoKTtcclxuICAgICAgICB9Ki9cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgICAgICBlbHNlIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzU3RvcmUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIHR5cGVvZiBlLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJzaG93Q3VycmVudEdhbWVcIiBpbiBlLmRlZmF1bHQpWzBdXHJcbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncylbMF0uZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50R2FtZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgICAgIGVsc2UgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIEFudGlBZERNLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNlwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTdcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRpYWxpemVTZXR0aW5ncygpIHtcclxuICAgICAgICAvL2lmIChzZXR0aW5nc0Nvb2tpZS5yZWFjdERldlRvb2xzKSByZWFjdERldlRvb2xzLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTJcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTNcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNFwiXSkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTVcIl0pIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0pIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy00XCJdKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMVwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0yXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiXSkgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTNcIl0pIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AodHJ1ZSlcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNFwiXSkgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNlwiXSkgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtN1wiXSkgZGlzYWJsZVR5cGluZy5lbmFibGUoKVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIHtcclxuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy04XCJdKSBkTW9kZS5zdGFydERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLWRtLTFcIl0pIGRNb2RlLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcblxyXG4gICAgICAgIHRoaXMuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZVNldHRpbmdzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiLCBzZXR0aW5nc0Nvb2tpZSk7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZFNldHRpbmdzKCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NDb29raWUsIERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyU2lkZWJhcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zaWRlYmFyLnJlbmRlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcmVDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXHJcbiAgICB9XHJcblxyXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRoaXMubGlnaHRjb3JkU2V0dGluZ3MubWFwKChzZWN0aW9uLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgIChpID09PSAwID8gbnVsbCA6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChNYXJnaW5Ub3ApKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHNlY3Rpb24udGl0bGUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb24uc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKGlkLCBjaGVja2VkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgfSksIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uLCB7XHJcbiAgICAgICAgICAgICAgICBjb2xvcjogXCJ5ZWxsb3dcIixcclxuICAgICAgICAgICAgICAgIGxvb2s6IFwiZ2hvc3RcIixcclxuICAgICAgICAgICAgICAgIHNpemU6IFwibWVkaXVtXCIsXHJcbiAgICAgICAgICAgICAgICBob3ZlckNvbG9yOiBcInJlZFwiLFxyXG4gICAgICAgICAgICAgICAgb25DbGljaygpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiU2hvdWxkIHJlbGF1bmNoXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M6IHJlbW90ZS5wcm9jZXNzLmFyZ3Yuc2xpY2UoMSkuY29uY2F0KFtcIi0tZGlzYWJsZS1iZXR0ZXJkaXNjb3JkXCJdKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLmFwcC5xdWl0KClcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB3cmFwcGVyOiB0cnVlXHJcbiAgICAgICAgICAgIH0sIFwiUmVsYXVuY2ggd2l0aG91dCBCZXR0ZXJEaXNjb3JkXCIpXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIFByZXNlbmNlQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX1ByZXNlbmNlU2V0dGluZ3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxwcGFubmVsXCIsXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBcclxuICAgICAgICAgICAgc2V0dGluZ3M6IHRoaXMuUHJlc2VuY2VTZXR0aW5nc1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgQWNjb3VudEluZm9zQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0FjY291bnRJbmZvcywge1xyXG4gICAgICAgICAgICBrZXk6IFwibGFwYW5uZWxcIlxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgQXBpUHJldmlld0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEFwaVByZXZpZXcsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGlwYW5uZWxcIlxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgY3VzdG9tQ3NzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ3NzRWRpdG9yLCB7a2V5OiBcImNzc2VkaXRvclwifSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJBZGRvblBhbmUodHlwZSkge1xyXG4gICAgICAgIC8vIEkga25vdyB0aGlzIHNob3VsZG4ndCBiZSBoZXJlLCBidXQgd2hlbiBpdCBpc24ndCxcclxuICAgICAgICAvLyBSZWFjdCByZWZ1c2VzIHRvIGNoYW5nZSB0aGUgYnV0dG9uIHdoZW4gZ29pbmdcclxuICAgICAgICAvLyBiZXR3ZWVuIHBsdWdpbnMgYW5kIHRoZW1lcyBwYWdlLi4uIHNvbWV0aGluZ1xyXG4gICAgICAgIC8vIHRvIGRlYnVnIGxhdGVyLlxyXG4gICAgICAgIGNsYXNzIENvbnRlbnRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdC5Db21wb25lbnQge1xyXG4gICAgICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgICAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLnByb3BzLnR5cGUucmVwbGFjZShcInNcIiwgXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMudHlwZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgcmVuZGVyKCkge3JldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO31cclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDb250ZW50TGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDb250ZW50TGlzdC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICAgICAgICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50TGlzdCwge3R5cGV9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ2FyZExpc3QsIHt0eXBlfSkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIE5vIG5lZWQgdG8gZXhwb3J0IHNldHRpbmdzUGFuZWwgb24gd2luZG93XHJcbiAqL1xyXG5cclxuZnVuY3Rpb24gbWFrZUNvbXBvbmVudChjaGlsZHJlbil7XHJcbiAgICBjbGFzcyBTZXR0aW5nQ29tcG9uZW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuKClcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gU2V0dGluZ0NvbXBvbmVudFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLnBhbmVscyA9IHt9XHJcbiAgICB9XHJcblxyXG4gICAgcmVnaXN0ZXIocGFuZWwsIGNvbXBvbmVudCl7XHJcbiAgICAgICAgdGhpcy5wYW5lbHNbcGFuZWxdID0gY29tcG9uZW50XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29tcG9uZW50KHBhbmVsKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5wYW5lbHNbcGFuZWxdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGl0ZW1zKCkge1xyXG4gICAgICAgIHJldHVybiBbe1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkJldHRlckRpc2NvcmQgU2V0dGluZ3NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImNvcmVcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJQbHVnaW5zXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJwbHVnaW5zXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiVGhlbWVzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJ0aGVtZXNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJDdXN0b20gQ1NTXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjdXN0b21jc3NcIlxyXG4gICAgICAgIH1dO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBMQ2l0ZW1zKCl7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkxpZ2h0Y29yZCBTZXR0aW5nc1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwibGlnaHRjb3JkXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJSaWNoUHJlc2VuY2VcIiwgXHJcbiAgICAgICAgICAgICAgICBpZDogXCJzdGF0dXNcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkFjY291bnQgSW5mb1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYWNjb3VudGluZm9cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGlmKHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlpdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgdGV4dDogXCJBcGkgQ29tcG9uZW50cyBQcmV2aWV3XCIsXHJcbiAgICAgICAgICAgIGlkOiBcImxjYXBpcHJldmlld1wiXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gaXRlbXNcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIC4uLnRoaXMuTENpdGVtcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KFwiQkRDaGFuZ2Vsb2dUaXRsZVwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XHJcbiAqLyIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNsYXNzIFRoZW1lTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlRoZW1lTW9kdWxlID0gdGhpc1xyXG4gICAgfVxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyO31cclxufVxyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZXMgPSBhc3luYyBmdW5jdGlvbiAoKSB7XHJcbiAgICB0aGlzLmxvYWRUaGVtZURhdGEoKTtcclxuICAgIGJkdGhlbWVFcnJvcnMuc3BsaWNlKDAsIDAsIC4uLihhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkVGhlbWVzKCkpKTtcclxuICAgIGNvbnN0IHRoZW1lcyA9IE9iamVjdC5rZXlzKGJkdGhlbWVzKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoZW1lcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbdGhlbWVzW2ldXTtcclxuICAgICAgICBpZiAoIXRoZW1lQ29va2llW3RoZW1lLm5hbWVdKSB0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG5cclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMCkpXHJcbiAgICB9XHJcbiAgICBmb3IgKGNvbnN0IHRoZW1lIGluIHRoZW1lQ29va2llKSB7XHJcbiAgICAgICAgaWYgKCFiZHRoZW1lc1t0aGVtZV0pIGRlbGV0ZSB0aGVtZUNvb2tpZVt0aGVtZV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSB0cnVlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCksIHVuZXNjYXBlKHRoZW1lLmNzcykpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBhcHBsaWVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUpO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC4gSXQgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtbG9hZGVkXCIsIHRoZW1lLm5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVubG9hZFRoZW1lID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBkZWxldGUgYmR0aGVtZXNbdGhlbWVdO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgdGhpcy51bmxvYWRUaGVtZShiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImZzXCIpLnVubGlua1N5bmMoZnVsbFBhdGgpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm4gdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lLm5hbWU7XHJcbiAgICBjb25zdCBlcnJvciA9IGF3YWl0IENvbnRlbnRNYW5hZ2VyLnJlbG9hZENvbnRlbnQoYmR0aGVtZXNbdGhlbWVdLmZpbGVuYW1lLCBcInRoZW1lXCIpO1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpLCB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIGVycm9yKTtcclxuICAgIH1cclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXJlbG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZWxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS51cGRhdGVUaGVtZUxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInRoZW1lXCIpO1xyXG4gICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiByZXN1bHRzLmFkZGVkKSB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZSk7XHJcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgcmVzdWx0cy5yZW1vdmVkKSB0aGlzLnVubG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmxvYWRUaGVtZURhdGEgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInRoZW1lc1wiKTtcclxuICAgIGlmIChzYXZlZCkge1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhlbWVDb29raWUsIHNhdmVkKTtcclxuICAgIH1cclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5zYXZlVGhlbWVEYXRhID0gZnVuY3Rpb24gKCkge1xyXG4gICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInRoZW1lc1wiLCB0aGVtZUNvb2tpZSk7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgVGhlbWVNb2R1bGUoKTsiLCJpbXBvcnQge2JiZFZlcnNpb24sIHNldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcclxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgd2lkdGggKi9cclxuICAgIHN0YXRpYyBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9XHJcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xyXG4gICAgc3RhdGljIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dpbmRvd0NvbmZpZ0ZpbGUgPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIGdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIFxyXG4gICAgc3RhdGljIHNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN0cmlwQk9NKGNvbnRlbnQpIHtcclxuICAgICAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcclxuICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQuc2xpY2UoMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjb250ZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRUZXh0QXJlYSgpIHtcclxuICAgICAgICByZXR1cm4gRE9NLnF1ZXJ5KFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoYW5uZWxUZXh0QXJlYSAmJiBlLnRpdGxlV3JhcHBlcilbMF0uY2hhbm5lbFRleHRBcmVhLnNwbGl0KFwiIFwiKVswXStcIiB0ZXh0YXJlYVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaW5zZXJ0VGV4dCh0ZXh0YXJlYSwgdGV4dCkge1xyXG4gICAgICAgIHRleHRhcmVhLmZvY3VzKCk7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xyXG4gICAgICAgIHRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IHRleHRhcmVhLnZhbHVlLmxlbmd0aDtcclxuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZChcImluc2VydFRleHRcIiwgZmFsc2UsIHRleHQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlc2NhcGVJRChpZCkge1xyXG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjM2E3MWMxOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjM2E3MWMxO1wiLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgd2Fybihtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGAlY1tCYW5kYWdlZEJEXSVjIFske21vZHVsZU5hbWV9XSVjICR7bWVzc2FnZX1gLCBcImNvbG9yOiAjRThBNDAwOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiAjRThBNDAwO1wiLCBcIlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXJyKG1vZHVsZU5hbWUsIG1lc3NhZ2UsIGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogcmVkO1wiLCBcIlwiKTtcclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChcIiVjRXJyb3I6IFwiICsgZXJyb3IubWVzc2FnZSwgXCJjb2xvcjogcmVkO1wiKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZShzKSB7XHJcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHRlc3RKU09OKGRhdGEpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xyXG4gICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogPT0gdW5kZWZpbmVkIHx8IG9iaiA9PSBcIlwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mKG9iaikgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xyXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgICAgIHJldHVybiAoLi4ucGFyYW1zKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHsgdGhpcy5lcnIoXCJTdXBwcmVzc2VkRXJyb3JcIiwgXCJFcnJvciBvY2N1cnJlZCBpbiBcIiArIG1lc3NhZ2UsIGUpOyB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgbW9ua2V5UGF0Y2god2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBvcHRpb25zLmRpc3BsYXlOYW1lIHx8IHdoYXQuZGlzcGxheU5hbWUgfHwgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSB8fCB3aGF0Lm5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5kaXNwbGF5TmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLm5hbWU7XHJcbiAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwicGF0Y2hcIiwgbWV0aG9kTmFtZSwgXCJvZlwiLCBkaXNwbGF5TmFtZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xyXG4gICAgICAgICAgICBpZiAoZm9yY2UpIHdoYXRbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHt9O1xyXG4gICAgICAgICAgICBlbHNlIHJldHVybiBjb25zb2xlLmVycm9yKG1ldGhvZE5hbWUsIFwiZG9lcyBub3QgZXhpc3QgZm9yXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB3aGF0W21ldGhvZE5hbWVdO1xyXG4gICAgICAgIGxldCBjYW5jZWxlZCA9IGZhbHNlXHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgLy93aGF0W21ldGhvZE5hbWVdID0gb3JpZ01ldGhvZDtcclxuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlIC8vIHRoaXMgYWxsb3cgdG8gbW9ua2V5cGF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lLlxyXG4gICAgICAgIH07XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBpZihjYW5jZWxlZCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ01ldGhvZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xyXG4gICAgICAgICAgICAgICAgdGhpc09iamVjdDogdGhpcyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZEFyZ3VtZW50czogYXJndW1lbnRzLFxyXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kOiBvcmlnTWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbE9yaWdpbmFsTWV0aG9kOiAoKSA9PiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5vcmlnaW5hbE1ldGhvZC5hcHBseShkYXRhLnRoaXNPYmplY3QsIGRhdGEubWV0aG9kQXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZiAoaW5zdGVhZCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcFJldCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKGluc3RlYWQsIFwiYGluc3RlYWRgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVtcFJldCAhPT0gdW5kZWZpbmVkKSBkYXRhLnJldHVyblZhbHVlID0gdGVtcFJldDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgZGF0YS5jYWxsT3JpZ2luYWxNZXRob2QoKTtcclxuICAgICAgICAgICAgICAgIGlmIChhZnRlcikgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYWZ0ZXIsIFwiYGFmdGVyYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvbmNlKSBjYW5jZWwoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgfTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHdoYXRbbWV0aG9kTmFtZV0sIG9yaWdNZXRob2QpO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uX19tb25rZXlQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QpIHtcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kID0gb3JpZ01ldGhvZDtcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge3JldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7fTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNhbmNlbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgb25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IG0gPSAwOyBtIDwgbXV0YXRpb25zLmxlbmd0aDsgbSsrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1ttXTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0TWF0Y2ggPSBub2Rlcy5pbmRleE9mKG5vZGUpID4gLTE7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyhub2RlKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0TmVzdGVkUHJvcChvYmosIHBhdGgpIHtcclxuICAgICAgICByZXR1cm4gcGF0aC5zcGxpdCgvXFxzP1xcLlxccz8vKS5yZWR1Y2UoZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3Byb3BdO1xyXG4gICAgICAgIH0sIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIHNob3dzIGEgdG9hc3Qgc2ltaWxhciB0byBhbmRyb2lkIHRvd2FyZHMgdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuLlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IFRoZSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9hc3QuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyBPcHRpb25zIG9iamVjdC4gT3B0aW9uYWwgcGFyYW1ldGVyLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBDaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZSB0b2FzdCBzdHlsaXN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkuIENob2ljZXM6IFwiXCIsIFwiaW5mb1wiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIi9cImVycm9yXCIsIFwid2FybmluZ1wiL1wid2FyblwiLiBEZWZhdWx0OiBcIlwiXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuaWNvbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGljb24gc2hvdWxkIHNob3cgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZS4gQSB0b2FzdCB3aXRob3V0IHR5cGUgd2lsbCBhbHdheXMgaGF2ZSBubyBpY29uLiBEZWZhdWx0OiB0cnVlXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy50aW1lb3V0IEFkanVzdHMgdGhlIHRpbWUgKGluIG1zKSB0aGUgdG9hc3Qgc2hvdWxkIGJlIHNob3duIGZvciBiZWZvcmUgZGlzYXBwZWFyaW5nIGF1dG9tYXRpY2FsbHkuIERlZmF1bHQ6IDMwMDBcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNob3dUb2FzdChjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhciAmJiBlLmhhc05vdGljZSlbMF0uc2lkZWJhci5zcGxpdChcIiBcIilbOV0rXCIgKyBkaXZcIikgfHwgbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbWVtYmVybGlzdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLm1lbWJlcnNXcmFwKVswXS5tZW1iZXJzV3JhcCkgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBmb3JtID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCJmb3JtXCIpIDogbnVsbDtcclxuICAgICAgICAgICAgY29uc3QgbGVmdCA9IGNvbnRhaW5lciA/IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogMzEwO1xyXG4gICAgICAgICAgICBjb25zdCByaWdodCA9IG1lbWJlcmxpc3QgPyBtZW1iZXJsaXN0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAwO1xyXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHJpZ2h0ID8gcmlnaHQgLSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IFV0aWxzLnNjcmVlbldpZHRoIC0gbGVmdCAtIDI0MDtcclxuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gZm9ybSA/IGZvcm0ub2Zmc2V0SGVpZ2h0IDogODA7XHJcbiAgICAgICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RzXCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIGxlZnQgKyBcInB4XCIpO1xyXG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJ3aWR0aFwiLCB3aWR0aCArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImJvdHRvbVwiLCBib3R0b20gKyBcInB4XCIpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKS5hcHBlbmRDaGlsZCh0b2FzdFdyYXBwZXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB7dHlwZSA9IFwiXCIsIGljb24gPSB0cnVlLCB0aW1lb3V0ID0gMzAwMH0gPSBvcHRpb25zO1xyXG4gICAgICAgIGNvbnN0IHRvYXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcbiAgICAgICAgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdFwiKTtcclxuICAgICAgICBpZiAodHlwZSkgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJ0b2FzdC1cIiArIHR5cGUpO1xyXG4gICAgICAgIGlmICh0eXBlICYmIGljb24pIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiaWNvblwiKTtcclxuICAgICAgICB0b2FzdEVsZW0uaW5uZXJUZXh0ID0gY29udGVudDtcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5hcHBlbmRDaGlsZCh0b2FzdEVsZW0pO1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdG9hc3RFbGVtLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJkLXRvYXN0cyAuYmQtdG9hc3RcIikubGVuZ3RoKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICB9LCB0aW1lb3V0KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYWxlcnQodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+JHt0aXRsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvbnRlbnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcclxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcclxuICAgICAgICBjb25zdCBjbG9zaW5nTGlzdGVuZXJzID0gW11cclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXHJcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgb25DbG9zZTogKGxpc3RlbmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBwbHVnaW5FcnJvcnMgPSBbXSwgdGhlbWVzOiB0aGVtZUVycm9ycyA9IFtdfSkge1xyXG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzIHx8ICF0aGVtZUVycm9ycykgcmV0dXJuO1xyXG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzLmxlbmd0aCAmJiAhdGhlbWVFcnJvcnMubGVuZ3RoKSByZXR1cm47XHJcbiAgICAgICAgbGV0IG1vZGFsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubW9kYWwgJiYgZS5pbm5lciAmJiAhZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxyXG4gICAgICAgIGxldCBmb290ZXIyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuZm9jdXNMb2NrKVswXVxyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJiZC1tb2RhbC13cmFwcGVyIHRoZW1lLWRhcmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbCBiZC1jb250ZW50LW1vZGFsICR7bW9kYWxNb2R1bGUubW9kYWx9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj48ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250ZW50IEVycm9yczwvZGl2PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgVE9QXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItaXRlbVwiPlBsdWdpbnM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+VGhlbWVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj5OYW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+TWVzc2FnZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj5FcnJvcjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyLXdyYXAgZmFkZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNjcm9sbGVyXCI+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgXHJcbiAgICAgICAgZnVuY3Rpb24gZ2VuZXJhdGVUYWIoZXJyb3JzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JzXCI+YCk7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXJyIG9mIGVycm9ycykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImVycm9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj4ke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPiR7ZXJyLm1lc3NhZ2V9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLWVycm9yXCI+PGEgY2xhc3M9XCJlcnJvci1saW5rXCIgaHJlZj1cIlwiPiR7ZXJyLmVycm9yID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBcIlwifTwvYT48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYEVycm9yIGRldGFpbHMgZm9yICR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfS5gLCBlcnIuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBbZ2VuZXJhdGVUYWIocGx1Z2luRXJyb3JzKSwgZ2VuZXJhdGVUYWIodGhlbWVFcnJvcnMpXTtcclxuICAgIFxyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbS5zZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkKSBET00ucmVtb3ZlQ2xhc3Moc2VsZWN0ZWQsIFwic2VsZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhlLnRhcmdldCwgXCJzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnNjcm9sbGVyXCIpO1xyXG4gICAgICAgICAgICBzY3JvbGxlci5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQodGFic1tET00uaW5kZXgoZS50YXJnZXQpXSk7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgXHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIERPTS5xdWVyeShcIiNhcHAtbW91bnRcIikuYXBwZW5kKG1vZGFsKTtcclxuICAgICAgICBpZiAocGx1Z2luRXJyb3JzLmxlbmd0aCkgbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW1cIikuY2xpY2soKTtcclxuICAgICAgICBlbHNlIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIudGFiLWJhci1pdGVtXCIpWzFdLmNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHNob3dDaGFuZ2Vsb2dNb2RhbChvcHRpb25zID0ge30pIHtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBjb25zdCBDaGFuZ2Vsb2dDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJmaXhlZFwiLCBcImltcHJvdmVkXCIpO1xyXG4gICAgICAgIGNvbnN0IFRleHRFbGVtZW50ID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJUZXh0XCIpO1xyXG4gICAgICAgIGNvbnN0IEZsZXhDaGlsZCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiQ2hpbGRcIik7XHJcbiAgICAgICAgY29uc3QgVGl0bGVzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJUYWdzXCIsIFwiZGVmYXVsdFwiKTtcclxuICAgICAgICBjb25zdCBDaGFuZ2Vsb2cgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuc2VsZWN0YWJsZSA9PSBmYWxzZSk7XHJcbiAgICAgICAgY29uc3QgTWFya2Rvd25QYXJzZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImRlZmF1bHRSdWxlc1wiLCBcInBhcnNlXCIpO1xyXG4gICAgICAgIGlmICghQ2hhbmdlbG9nIHx8ICFNb2RhbFN0YWNrIHx8ICFDaGFuZ2Vsb2dDbGFzc2VzIHx8ICFUZXh0RWxlbWVudCB8fCAhRmxleENoaWxkIHx8ICFUaXRsZXMgfHwgIU1hcmtkb3duUGFyc2VyKSByZXR1cm47XHJcbiAgICBcclxuICAgICAgICBjb25zdCB7XHJcbiAgICAgICAgICAgIGltYWdlID0gXCJodHRwczovL3JlcG9zaXRvcnktaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMDU0NzM1MzcvOTU3YjU0ODAtN2MyNi0xMWU5LTg0MDEtNTBmYTgyMGNiYWU1XCIsIFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IFwiXCIsIFxyXG4gICAgICAgICAgICBjaGFuZ2VzID0gW10sIFxyXG4gICAgICAgICAgICB0aXRsZSA9IFwiQmFuZGFnZWRCRFwiLCBcclxuICAgICAgICAgICAgc3VidGl0bGUgPSBgdiR7YmJkVmVyc2lvbn1gLCBcclxuICAgICAgICAgICAgZm9vdGVyXHJcbiAgICAgICAgfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgY2UgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQ7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nSXRlbXMgPSBbY2UoXCJpbWdcIiwge3NyYzogaW1hZ2V9KV07XHJcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwicFwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShkZXNjcmlwdGlvbikpKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNoYW5nZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBjaGFuZ2VzW2NdO1xyXG4gICAgICAgICAgICBjb25zdCB0eXBlID0gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA/IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gOiBDaGFuZ2Vsb2dDbGFzc2VzLmFkZGVkO1xyXG4gICAgICAgICAgICBjb25zdCBtYXJnaW4gPSBjID09IDAgPyBDaGFuZ2Vsb2dDbGFzc2VzLm1hcmdpblRvcCA6IFwiXCI7XHJcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJoMVwiLCB7Y2xhc3NOYW1lOiBgJHt0eXBlfSAke21hcmdpbn1gLH0sIGVudHJ5LnRpdGxlKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBjZShcInVsXCIsIG51bGwsIGVudHJ5Lml0ZW1zLm1hcChpID0+IGNlKFwibGlcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoaSkpKSk7XHJcbiAgICAgICAgICAgIGNoYW5nZWxvZ0l0ZW1zLnB1c2gobGlzdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHJlbmRlckhlYWRlciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICByZXR1cm4gY2UoRmxleENoaWxkLkNoaWxkLCB7Z3JvdzogMSwgc2hyaW5rOiAxfSxcclxuICAgICAgICAgICAgICAgIGNlKFRpdGxlcy5kZWZhdWx0LCB7dGFnOiBUaXRsZXMuVGFncy5INH0sIHRpdGxlKSxcclxuICAgICAgICAgICAgICAgIGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRCwgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmRhdGV9LCBzdWJ0aXRsZSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9O1xyXG4gICAgXHJcbiAgICAgICAgY29uc3QgcmVuZGVyRm9vdGVyID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgICAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcclxuICAgICAgICAgICAgY29uc3Qgam9pblN1cHBvcnRTZXJ2ZXIgPSAoY2xpY2spID0+IHtcclxuICAgICAgICAgICAgICAgIGNsaWNrLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIE1vZGFsU3RhY2sucG9wKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLmpvaW5CRDIoKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY29uc3Qgc3VwcG9ydExpbmsgPSBBbmNob3IgPyBjZShBbmNob3IsIHtvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpIDogY2UoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0Rm9vdGVyID0gY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJEfSwgXCJOZWVkIHN1cHBvcnQ/IFwiLCBzdXBwb3J0TGluayk7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LCBmb290ZXIgPyBmb290ZXIgOiBkZWZhdWx0Rm9vdGVyKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShDaGFuZ2Vsb2csIE9iamVjdC5hc3NpZ24oe1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmNvbnRhaW5lcixcclxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBvblNjcm9sbDogXyA9PiBfLFxyXG4gICAgICAgICAgICAgICAgb25DbG9zZTogXyA9PiBfLFxyXG4gICAgICAgICAgICAgICAgcmVuZGVySGVhZGVyOiByZW5kZXJIZWFkZXIsXHJcbiAgICAgICAgICAgICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBjaGFuZ2Vsb2dJdGVtc1xyXG4gICAgICAgICAgICB9LCBwcm9wcykpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBzaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IE1hcmtkb3duID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNYXJrZG93blwiKTtcclxuICAgICAgICBjb25zdCBDb25maXJtYXRpb25Nb2RhbCA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmtleSAmJiBtLmtleSgpID09IFwiY29uZmlybS1tb2RhbFwiKTtcclxuICAgICAgICBpZiAoIU1vZGFsU3RhY2sgfHwgIUNvbmZpcm1hdGlvbk1vZGFsIHx8ICFNYXJrZG93bikgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcclxuXHJcbiAgICAgICAgY29uc3QgZW1wdHlGdW5jdGlvbiA9ICgpID0+IHt9O1xyXG4gICAgICAgIGNvbnN0IHtvbkNvbmZpcm0gPSBlbXB0eUZ1bmN0aW9uLCBvbkNhbmNlbCA9IGVtcHR5RnVuY3Rpb24sIGNvbmZpcm1UZXh0ID0gXCJPa2F5XCIsIGNhbmNlbFRleHQgPSBcIkNhbmNlbFwiLCBkYW5nZXIgPSBmYWxzZSwga2V5ID0gdW5kZWZpbmVkfSA9IG9wdGlvbnM7XHJcblxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjb250ZW50KSkgY29udGVudCA9IFtjb250ZW50XTtcclxuICAgICAgICBjb250ZW50ID0gY29udGVudC5tYXAoYyA9PiB0eXBlb2YoYykgPT09IFwic3RyaW5nXCIgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2Rvd24sIG51bGwsIGMpIDogYyk7XHJcbiAgICAgICAgcmV0dXJuIE1vZGFsU3RhY2sucHVzaChDb25maXJtYXRpb25Nb2RhbCwge1xyXG4gICAgICAgICAgICBoZWFkZXI6IHRpdGxlLFxyXG4gICAgICAgICAgICBjaGlsZHJlbjogY29udGVudCxcclxuICAgICAgICAgICAgcmVkOiBkYW5nZXIsXHJcbiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBjb25maXJtVGV4dCxcclxuICAgICAgICAgICAgY2FuY2VsVGV4dDogY2FuY2VsVGV4dCxcclxuICAgICAgICAgICAgb25Db25maXJtOiBvbkNvbmZpcm0sXHJcbiAgICAgICAgICAgIG9uQ2FuY2VsOiBvbkNhbmNlbFxyXG4gICAgICAgIH0sIGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHJlbW92ZURhKGNsYXNzTmFtZSl7XHJcbiAgICAgICAgaWYoIWNsYXNzTmFtZSlyZXR1cm4gY2xhc3NOYW1lXHJcbiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZS5zcGxpdChcIiBcIikuZmlsdGVyKGUgPT4gIWUuc3RhcnRzV2l0aChcImRhLVwiKSkuam9pbihcIiBcIilcclxuICAgIH1cclxufVxyXG5cclxuVXRpbHMuc2hvd1RvYXN0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoVXRpbHMuc2hvd1RvYXN0LCBcIkNvdWxkIG5vdCBzaG93IHRvYXN0LlwiKTtcclxuXHJcbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5VdGlscyA9IFV0aWxzIiwiaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLldlYnBhY2tNb2R1bGVzID0gKCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcmVxID0gd2VicGFja0pzb25wLnB1c2goW1tdLCB7X19leHRyYV9pZF9fOiAobW9kdWxlLCBleHBvcnRzLCByZXEpID0+IG1vZHVsZS5leHBvcnRzID0gcmVxfSwgW1tcIl9fZXh0cmFfaWRfX1wiXV1dKTtcclxuICAgICAgICAgICAgZGVsZXRlIHJlcS5tLl9fZXh0cmFfaWRfXztcclxuICAgICAgICAgICAgZGVsZXRlIHJlcS5jLl9fZXh0cmFfaWRfXztcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5yZW1vdmUgJiYgdGhlTW9kdWxlLnNldCAmJiB0aGVNb2R1bGUuY2xlYXIgJiYgdGhlTW9kdWxlLmdldCAmJiAhdGhlTW9kdWxlLnNvcnQpIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5nZXRUb2tlbiB8fCB0aGVNb2R1bGUuZ2V0RW1haWwgfHwgdGhlTW9kdWxlLnNob3dUb2tlbikgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBwcm90ZWN0ID0gdGhlTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhlTW9kdWxlLmdldFRva2VuICYmICF0aGVNb2R1bGUuZ2V0RW1haWwgJiYgIXRoZU1vZHVsZS5zaG93VG9rZW4pIHJldHVybiB0aGVNb2R1bGU7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eSh0aGVNb2R1bGUsIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJnZXRUb2tlblwiIHx8IHByb3AgPT09IFwiZ2V0RW1haWxcIiB8fCBwcm9wID09PSBcInNob3dUb2tlblwiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIGZ1bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRUb2tlblwiKSByZXR1cm4gKCkgPT4gXCJtZmEuWENuYkt6bzBDTElxZEp6Qm5MMEQ4UGZEcnVxa0pOSGp3SFh0cjM5VVUzRjhoSHg0M2pvaklTeWk1amRqTzUyZTlfZTlNam1hZlpGRnBjLXNlT01hXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwiZ2V0RW1haWxcIikgcmV0dXJuICgpID0+IFwicHVwcGV0MTExMTJAZ21haWwuY29tXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdW5jID09IFwic2hvd1Rva2VuXCIpIHJldHVybiAoKSA9PiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoZnVuYyA9PSBcIl9fcHJvdG9fX1wiKSByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmpbZnVuY107XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gcHJvdGVjdChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gcHJvdGVjdChtKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBjb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gocHJvdGVjdChtLmRlZmF1bHQpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0pKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKHByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbCA9IHtcclxuICAgICAgICAgICAgcmVhY3Q6IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJDb21wb25lbnRcIiwgXCJQdXJlQ29tcG9uZW50XCIsIFwiQ2hpbGRyZW5cIiwgXCJjcmVhdGVFbGVtZW50XCIsIFwiY2xvbmVFbGVtZW50XCJdKSxcclxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGUgPT4gZVtPYmplY3Qua2V5cyhlKS5maW5kKGsgPT4gay5zdGFydHNXaXRoKFwiX19yZWFjdEludGVybmFsSW5zdGFuY2VcIikpXTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgam9pbkJEMSgpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjBUbWZvNVpiT1JDUnFiQWRcIik7fVxyXG4gICAgbGVhdmVCRDEoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIpO31cclxuXHJcbiAgICBqb2luQkQyKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMkhTY204alwiKTt9XHJcbiAgICBsZWF2ZUJEMigpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiMjgwODA2NDcyOTI4MTk4NjU2XCIpO31cclxuXHJcbiAgICBqb2luTEMoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCI3ZUZmZjJBXCIpO31cclxuICAgIGxlYXZlTEMoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjcwNTkwODM1MDIxODY2NjExN1wiKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG5cclxuICAgIGdldCBhbmNob3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiXSkgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07fVxyXG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cclxuICAgIGdldCBtZXNzYWdlQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm1lc3NhZ2VcIiwgXCJjb250YWluZXJDb3p5XCJdKTt9XHJcbiAgICBnZXQgZ3VpbGRDbGFzc2VzKCkge1xyXG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ3VpbGRzRXJyb3IgJiYgZS5zZWxlY3RlZClbMF1cclxuICAgICAgICBjb25zdCBwaWxsID0gQkRNb2R1bGVzLmdldChlID0+IGUuYmxvYkNvbnRhaW5lcilbMF1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxuXHR9XHJcblxyXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XHJcbiAgICBnZXQgTWVzc2FnZUNvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJNZXNzYWdlXCIpO31cclxuICAgIGdldCBUaW1lRm9ybWF0dGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZGF0ZUZvcm1hdFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XHJcbiAgICBnZXQgTmF0aXZlTW9kdWxlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2V0QmFkZ2VcIl0pO31cclxuICAgIGdldCBJbnZpdGVBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTt9XHJcbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmhpZGUgJiYgbS5zaG93ICYmICFtLnNlYXJjaCAmJiAhbS5zdWJtaXQgJiYgIW0uc2VhcmNoICYmICFtLmFjdGl2YXRlUmFnaW5nRGVtb24gJiYgIW0uZGlzbWlzcyk7fVxyXG4gICAgZ2V0IEtleUdlbmVyYXRvcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS50b1N0cmluZyAmJiAvXCJiaW5hcnlcIi8udGVzdChtLnRvU3RyaW5nKCkpKTt9XHJcbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XHJcbiAgICBnZXQgVXNlclN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q3VycmVudFVzZXJcIl0pO31cclxuICAgIGdldCBDaGFubmVsU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuICAgIGdldCBQcml2YXRlQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZWxlY3RQcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG5cclxuICAgIG9wZW5ETSh1c2VySWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmSWQgPSB0aGlzLlVzZXJTdG9yZS5nZXRDdXJyZW50VXNlcigpLmlkO1xyXG4gICAgICAgIGlmIChzZWxmSWQgPT0gdXNlcklkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xyXG4gICAgICAgIGlmIChwcml2YXRlQ2hhbm5lbElkKSByZXR1cm4gdGhpcy5Qcml2YXRlQ2hhbm5lbEFjdGlvbnMuc2VsZWN0UHJpdmF0ZUNoYW5uZWwocHJpdmF0ZUNoYW5uZWxJZCk7XHJcbiAgICAgICAgdGhpcy5DaGFubmVsQWN0aW9ucy5vcGVuUHJpdmF0ZUNoYW5uZWwoc2VsZklkLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlU2V0dGluZ3MoY2F0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdCAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0gcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IHN0eWxlID0gYFxyXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGF0LTNiUnh4dSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNpZGViYXItMks4cEZoIHtcclxuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFZvaWNlTW9kZSB7XHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiVm9pY2VNb2RlXCIpO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbmRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbmRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBtLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKC4uLnByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxubGV0IG1vZCA9ICB7ZmluZCwgZmluZEFsbCwgZmluZEJ5UHJvcHMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuZXhwb3J0IGRlZmF1bHQgbW9kXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuV2VicGFja01vZHVsZXMgPSBtb2QiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiXHJcblxyXG5sZXQgcHJvZmlsTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQub3BlbiAmJiBlLmRlZmF1bHQuZmV0Y2hNdXR1YWxGcmllbmRzKVswXVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGlnaHRjb3JkVXNlckJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG5cclxuICAgICAgICBkZWxldGUgcHJvcHMuaHJlZi50YXJnZXRcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2cocHJvcHMpXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxwcm9wcy5BbmNob3IgaHJlZj17XCIvdXNlcnMvXCIrcHJvcHMudXNlci5pZH0gey4uLnByb3BzLmhyZWZ9IG9uQ2xpY2s9eyhldikgPT4ge1xyXG4gICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgaWYoIXByb2ZpbE1vZHVsZSlwcm9maWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5vcGVuICYmIGUuZGVmYXVsdC5mZXRjaE11dHVhbEZyaWVuZHMpWzBdXHJcbiAgICAgICAgICAgICAgICBwcm9maWxNb2R1bGUuZGVmYXVsdC5vcGVuKHByb3BzLnVzZXIuaWQpXHJcbiAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9wcm9wcy5BbmNob3I+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEJ1Z0h1bnRlckJhZGdlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMzEuMyAyOS41XCIgey4uLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi44IDFzMTIgOC4yIDcuNCAxOS43UzE2LjYgMjkgMjAgMjUuNnMtNC01LjYtOC43LTEwTDIyLjggMVwiIGZpbGw9XCJyZ2JhKDIyNyw2LDE5LC42KVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjEgMTIuM2MtMi41IDMuMi02LjEgNC44LTguOSA0LjNMMy42IDI4LjhjLS43LjktMS45IDEtMi44LjMtLjktLjctMS0xLjktLjQtMi44TDEwIDE0LjFjLTEuMy0yLjUtLjYtNi40IDItOS43IDMuMi00IDgtNS41IDEwLjgtMy40czIuNCA3LjItLjcgMTEuM3pcIiBmaWxsPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBDaXJjdXMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgcmV0dXJuICg8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDM2IDM2XCIgIHsuLi50aGlzLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0REMkU0NFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zMyAzM2EyIDIgMCAwMS0yIDJINWEyIDIgMCAwMS0yLTJsMS0xMmgyOGwxIDEyelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0VBNTk2RVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xMyAzNWMtLjc5Mi0xLjg3NS0xLjc1LTMuMjkxLTMuNDE3LTQuNjY2IDEuNzUtMS40NTkgNC41NDItNS41IDUuMjUtOC4yOTJzMi43NSA4LjEyNSAyLjA0MiAxMC42MjVTMTMgMzUgMTMgMzV6bTEwLjMwMyAwYy43OTEtMS44NzUgMS43NS0zLjI5MSAzLjQxNi00LjY2Ni0xLjc1LTEuNDU5LTQuNTQxLTUuNS01LjI1LTguMjkyLS43MDctMi43OTItMi43NSA4LjEyNS0yLjA0IDEwLjYyNS43MDggMi41IDMuODc0IDIuMzMzIDMuODc0IDIuMzMzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0JFMTkzMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0zLjcyOCAyNC4yNjNBMi41IDIuNSAwIDAwOCAyMi41YzAtLjU2NS0uMTk1LTEuMDgxLS41MTEtMS41SDRsLS4yNzIgMy4yNjN6bTI4LjU0NCAwTDMyIDIxaC0zLjQ4OUEyLjQ4MiAyLjQ4MiAwIDAwMjggMjIuNWEyLjUgMi41IDAgMDA0LjI3MiAxLjc2M3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxNFwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjJcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEwXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIyNlwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIzIDM1SDEzczItNiAyLTEzaDZjMCA3IDIgMTMgMiAxM3pNMTcgMmgydjdoLTJ6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzU1QUNFRVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOC44MzguMjA2QzE3LjY2Ny4wNDIgMTcgLjMxOCAxNyAxLjQxOHYxYzAgMS4xLjg2NSAxLjc1MyAxLjkyMyAxLjQ1MWw1LjE1NC0uOTAxYzEuNzE1LS4zNDMgMS41NDgtMS41OTMuMDg1LTEuODg0TDE4LjgzOC4yMDZ6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjQ0NENkREXCJcclxuICAgICAgICAgICAgICAgICAgICBkPVwiTTE4IDZsLS4wODEuMTIzQzEwLjkzOCAxNi45ODEgMyAxNS4wMTUgMyAxOXYyLjVhMi41IDIuNSAwIDAwNC45NS41SDEyYTIgMiAwIDAwNCAwaDRhMiAyIDAgMDA0IDBoNC4wNWEyLjUgMi41IDAgMDA0Ljk1LS41VjE5YzAtNC04LTItMTUtMTN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8ZyBmaWxsPVwiI0Y1RjhGQVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTQ4IDYuMDc4bC0uMDMuMDQ1QzE3LjEzMiAxMS42MTkgMTAuODExIDE2LjEyNiA4IDE4djRhMiAyIDAgMDA0IDB2LTRjLjk4Mi0uOTgyIDUuODEzLTYuNzg3IDUuOTg0LTExLjczMi0uMDEtLjA2NC0uMDI3LS4xMjYtLjAzNi0uMTl6bS4wOC4zOThDMTguMzI0IDExLjM3NCAyMy4wMzEgMTcuMDMxIDI0IDE4djRhMiAyIDAgMDA0IDB2LTRjLTIuNzUtMS44MzMtOC45NTMtNi4xOS05Ljk3Mi0xMS41MjR6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTcuOTg0IDYuMjdDMTcuOTIyIDguMzQ2IDE3LjYwNiAxNi4zOTQgMTYgMTh2NGEyIDIgMCAwMDQgMHYtNGMtMS41NjQtMS41NjQtMS45MDUtOS4yNDEtMS45NzktMTEuNTU5LS4wMTEtLjA1Ny0uMDI3LS4xMTMtLjAzNy0uMTcxelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0Y29yZExvZ28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2OCAxNjguNjlcIiB7Li4ucHJvcHN9IGhlaWdodD1cIjEwMCVcIiB3aWR0aD17cHJvcHMuc2l6ZX0+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2FcIiB4MT17NjYuN30geTE9ey00ODcuN30geDI9ezY2Ljd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExNFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2JcIiB4MT17MTAxLjd9IHkxPXstNDg3Ljd9IHgyPXsxMDEuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTIwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fY1wiIHgxPXs4NH0geTE9ey00MDh9IHgyPXs4NH0geTI9ey01NzYuNjl9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE0LjkgMzUuM2gxMzkuMlYxMzNIMTQuOXpcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02Ni43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2EpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAxLjcgNzkuN2MtNS40IDAtOS44IDQuNy05LjggMTAuNXM0LjQgMTAuNSA5LjggMTAuNSA5LjgtNC43IDkuOC0xMC41LTQuNC0xMC41LTkuOC0xMC41elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDB2MTY4bDE2OCAuNjlWMHptMTExLjMgMTI0LjFzLTMuNC00LjEtNi4zLTcuN2MxMi42LTMuNSAxNy40LTExLjMgMTcuNC0xMS4zYTUyLjUyIDUyLjUyIDAgMDEtMTEuMSA1LjYgNjguNjMgNjguNjMgMCAwMS0zOC45IDQgNzAuMTIgNzAuMTIgMCAwMS0xNC4xLTQuMSA0OC44OCA0OC44OCAwIDAxLTcuMS0zLjNjLS4zLS4yLS42LS4zLS45LS41YS43Ni43NiAwIDAwLS40LS4yYy0xLjctMS0yLjYtMS42LTIuNi0xLjZzNC42IDcuNiAxNi44IDExLjJjLTIuOSAzLjYtNi40IDcuOS02LjQgNy45LTIxLjItLjYtMjkuMy0xNC41LTI5LjMtMTQuNSAwLTMwLjYgMTMuOC01NS40IDEzLjgtNTUuNCAxMy44LTEwLjMgMjYuOS0xMCAyNi45LTEwbDEgMS4xQzUyLjggNTAuMyA0NSA1Ny45IDQ1IDU3LjlhNTYuMiA1Ni4yIDAgMDE1LjctMi43IDcyLjE5IDcyLjE5IDAgMDEyMS44LTYgOC43NSA4Ljc1IDAgMDExLjYtLjIgODkuMSA4OS4xIDAgMDExOS40LS4yIDc4LjQ1IDc4LjQ1IDAgMDEyOC45IDkuMXMtNy41LTcuMi0yMy45LTEyLjFsMS4zLTEuNXMxMy4xLS4zIDI2LjkgMTBjMCAwIDEzLjggMjQuOCAxMy44IDU1LjQuMS0uMS04IDEzLjgtMjkuMiAxNC40elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYylcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XHJcbiAqL1xyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxubGV0IGNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxubGV0IHNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbmxldCBzY3JvbGxiYXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF1cclxuY29uc3QgR3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZHMpWzBdLmRlZmF1bHRcclxuY29uc3QgcmVsYXRpb25TaGlwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0UmVsYXRpb25zaGlwcylbMF0uZGVmYXVsdFxyXG5jb25zdCBzZXNzaW9uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0U2Vzc2lvbnMpWzBdLmRlZmF1bHRcclxuY29uc3QgdXNlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQWNjb3VudEluZm9zIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZighbWFyZ2luTW9kdWxlMiltYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG4gICAgICAgIGlmKCFjb2xvck1vZHVsZSljb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbiAgICAgICAgaWYoIXNpemVNb2R1bGUpc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIkFjY291bnQgSW5mb3NcIi8+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBQcm9maWxlXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0UHJvZmlsZVZhbHVlKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIFN0YXRpc3RpY3NcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTdGF0aXN0aWNzKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIENvbm5lY3RlZCBTZXNzaW9uc1xyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFNlc3Npb25WYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICA8L2Rpdj4sXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0ubWFyZ2luQm90dG9tMjB9PjwvZGl2PlxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZXNzaW9uVmFsdWUoKXtcclxuICAgICAgICBjb25zdCBzZXNzaW9uc1JhdyA9IHNlc3Npb25Nb2R1bGUuZ2V0U2Vzc2lvbnMoKVxyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zID0gT2JqZWN0LmtleXMoc2Vzc2lvbnNSYXcpLmZpbHRlcihlID0+IGUgIT09IFwiYWxsXCIpLm1hcChlID0+IHNlc3Npb25zUmF3W2VdKVxyXG5cclxuICAgICAgICBpZihzZXNzaW9ucy5sZW5ndGggPT09IDApcmV0dXJuIFwiLSBObyBzZXNzaW9uIGRldGVjdGVkLiBQbGVhc2UgdHJ5IGluIGEgZmV3IHNlY29uZHNcIlxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBzZXNzaW9ucy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBgKyBpZDogJHtlLnNlc3Npb25JZH1cclxuKyBvczogJHtlLmNsaWVudEluZm8ub3NbMF0udG9VcHBlckNhc2UoKStlLmNsaWVudEluZm8ub3Muc2xpY2UoMSl9XHJcbisgY2xpZW50OiAke2UuY2xpZW50SW5mby5jbGllbnR9XHJcbisgc3RhdHVzOiAke2Uuc3RhdHVzfVxyXG4rIGFjdGl2ZTogJHtlLmFjdGl2ZSA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbisgQWN0aXZpdGllczogJHtlLmFjdGl2aXRpZXMubGVuZ3RofWBcclxuICAgICAgICB9KS5qb2luKFwiXFxuXCIrXCItXCIucmVwZWF0KDM4KStcIlxcblwiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFByb2ZpbGVWYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7RGF0ZX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBjcmVhdGVkQXQgPSB1c2VyLmNyZWF0ZWRBdFxyXG5cclxuICAgICAgICByZXR1cm4gYCsgVXNlcm5hbWU6ICR7dXNlci51c2VybmFtZX1cclxuKyBEaXNjcmltaW5hdG9yOiAke3VzZXIuZGlzY3JpbWluYXRvcn1cclxuKyBUYWc6ICR7dXNlci50YWd9XHJcbisgSUQ6ICR7dXNlci5pZH1cclxuKyBBdmF0YXI6ICR7dXNlci5hdmF0YXJ9XHJcbisgQXZhdGFyIFVSTDogaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXZhdGFycy8ke3VzZXIuaWR9LyR7dXNlci5hdmF0YXJ9LiR7dXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCJ9P3NpemU9NDA5NlxyXG4rIENyZWF0aW9uIERhdGU6ICR7KGNyZWF0ZWRBdC5nZXREYXRlKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0TW9udGgoKSsxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsIFwiMFwiKX0vJHsoY3JlYXRlZEF0LmdldEZ1bGxZZWFyKCkpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfSAke2NyZWF0ZWRBdC5nZXRIb3VycygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfWggJHtjcmVhdGVkQXQuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfW1pbiAke2NyZWF0ZWRBdC5nZXRTZWNvbmRzKCl9c1xyXG4rIEZsYWdzOiAke3VzZXIuZmxhZ3N9XHJcbisgSGFzIE5pdHJvOiAke3VzZXIuaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gRW1haWw6ICR7dXNlci5lbWFpbH1cclxuLSAyRkE6ICR7dXNlci5tZmFFbmFibGVkID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBIYXMgQmVlbiBPbiBNb2JpbGU6ICR7dXNlci5tb2JpbGUgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIFBob25lOiAke3VzZXIucGhvbmUgfHwgXCJOb25lXCJ9XHJcbi0gVmVyaWZpZWQ6ICR7dXNlci52ZXJpZmllZH1gXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdGlzdGljcygpe1xyXG5cclxuICAgICAgICBjb25zdCBndWlsZHMgPSBPYmplY3QudmFsdWVzKEd1aWxkTW9kdWxlLmdldEd1aWxkcygpKVxyXG4gICAgICAgIGNvbnN0IHJlbGF0aW9ucyA9IE9iamVjdC5rZXlzKHJlbGF0aW9uU2hpcE1vZHVsZS5nZXRSZWxhdGlvbnNoaXBzKCkpXHJcbiAgICAgICAgY29uc3QgZnJpZW5kcyA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNGcmllbmQoZSkpXHJcbiAgICAgICAgY29uc3QgYmxvY2tlZCA9IHJlbGF0aW9ucy5maWx0ZXIoZSA9PiByZWxhdGlvblNoaXBNb2R1bGUuaXNCbG9ja2VkKGUpKVxyXG5cclxuICAgICAgICByZXR1cm4gYCsgU2VydmVyIENvdW50OiAke2d1aWxkcy5sZW5ndGh9IHNlcnZlcnNcclxuKyBSZWxhdGlvbnM6ICR7cmVsYXRpb25zLmxlbmd0aH0gcmVsYXRpb25zXHJcbisgRnJpZW5kcyBDb3VudDogJHtmcmllbmRzLmxlbmd0aH0gZnJpZW5kc1xyXG4tIEJsb2NrZWQgVXNlcnMgQ291bnQ6ICR7YmxvY2tlZC5sZW5ndGh9IGJsb2NrZWQgdXNlcnNgXHJcbiAgICB9XHJcbn1cclxuXHJcblxyXG5sZXQgaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG5sZXQgbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG5cclxuY2xhc3MgQ29kZUNvbnRlbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUxKW1lc3NhZ2VNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXVxyXG4gICAgICAgIGlmKCFtZXNzYWdlTW9kdWxlMiltZXNzYWdlTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1lc3NhZ2VDb250ZW50KVswXVxyXG4gICAgICAgIGlmKCFzY3JvbGxiYXJNb2R1bGUxKXNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG4gICAgICAgIGlmKCFoaWdodGxpZ2h0SlMpaGlnaHRsaWdodEpTID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGlnaGxpZ2h0KVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7bWVzc2FnZU1vZHVsZTEubWFya3VwfSAke21lc3NhZ2VNb2R1bGUyLm1lc3NhZ2VDb250ZW50fWB9PlxyXG4gICAgICAgICAgICA8cHJlPlxyXG4gICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9e2Ake3Njcm9sbGJhck1vZHVsZTEuc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gaGxqc2B9IGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7X19odG1sOiBoaWdodGxpZ2h0SlMuaGlnaGxpZ2h0KHRoaXMucHJvcHMubGFuZ3VhZ2UsIHRoaXMucHJvcHMuY29udGVudCkudmFsdWV9fT5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2NvZGU+XHJcbiAgICAgICAgICAgIDwvcHJlPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiLy8gR29vZCBsdWNrIHRvIHJlYWQgbXkgY29kZSwgRXZlbiBtZSBjYW4ndCByZWFkIGl0IHByb3Blcmx5LlxyXG5cclxuaW1wb3J0IHsgc3RhdCB9IGZyb20gXCJmc1wiXHJcbmltcG9ydCB7IHV1aWR2NCB9IGZyb20gXCIuLi9tb2R1bGVzL2Rpc3RhbnRcIlxyXG5pbXBvcnQgd2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIlxyXG5pbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgTWFyZ2luVG9wIGZyb20gXCIuL21hcmdpbnRvcFwiXHJcblxyXG5jb25zdCBrZXlzID0ge1xyXG4gICAgc2V0dGluZ1RpdGxlOiB1dWlkdjQoKVxyXG59XHJcbmxldCBmb3JtTW9kdWxlXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaVByZXZpZXcgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogW11cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIWZvcm1Nb2R1bGUpZm9ybU1vZHVsZSA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLkZvcm1TZWN0aW9uKVxyXG4gICAgICAgIC8qKiBcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb25bXX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXSkubWFwKGsgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtrXSlcclxuICAgICAgICB9KS5mbGF0KCkpXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9XCJMaWdodGNvcmQncyBBcGkgQXZhaWxsYWJsZSBjb21wb25lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtVGV4dCB0eXBlPVwiZGVzY3JpcHRpb25cIiBjbGFzc05hbWU9XCJcIiBzZWxlY3RhYmxlPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1UZXh0PlxyXG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcD48L01hcmdpblRvcD5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiBjb2xvcj1cImJyYW5kXCIgbG9vaz1cIm91dGxpbmVkXCIgc2l6ZT1cIm1lZGl1bVwiIGhvdmVyQ29sb3I9XCJncmVlblwiIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuc2hlbGwub3BlbkV4dGVybmFsKFwiaHR0cHM6Ly9naXRodWIuY29tL2xpZ2h0Y29yZC9saWdodGNvcmQvd2lraS9BcGlzXCIpXHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvblxyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9mb3JtTW9kdWxlLkZvcm1TZWN0aW9uPixcclxuICAgICAgICAgICAgYWxsQ29tcG9uZW50cy5tYXAoY29tcCA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgQWxsUHJldmlld3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgaWYoY29tcC5BbGxQcmV2aWV3cylBbGxQcmV2aWV3cyA9IGNvbXAuQWxsUHJldmlld3NcclxuICAgICAgICAgICAgICAgIGxldCBvbkNoYW5nZSA9ICh0YWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgc2V0U3RhdGUgPSAobmV3U3RhdGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzOiBbT2JqZWN0LmFzc2lnbihzdGF0ZSwgbmV3U3RhdGUpXS5jb25jYXQodGhpcy5zdGF0ZS5zdGF0ZXMuZmlsdGVyKGUgPT4gZS5lbGVtICE9PSBjb21wKSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZS5zdGF0ZXMuZmluZChlID0+IGUuZWxlbSA9PT0gY29tcClcclxuICAgICAgICAgICAgICAgIGlmKCFzdGF0ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYjogXCJwcmV2aWV3XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW06IGNvbXAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHt9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuc3RhdGVzLnB1c2goc3RhdGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UHJvcHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsID0ge31cclxuICAgICAgICAgICAgICAgICAgICBBbGxQcmV2aWV3cy5mb3JFYWNoKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxbT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXSA9IGNhdGVnb3J5WzBdW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0YXRlLm9wdGlvbnMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxba2V5XSA9IEFsbFByZXZpZXdzLmZpbmQoZSA9PiBlLmZpbmQoZSA9PiBlW2tleV0pKVtzdGF0ZS5vcHRpb25zW2tleV1dW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IHJlbmRlclByZXZpZXcgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxkaXYgc3R5bGU9e3ttYXJnaW46IFwiMjBweFwifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXAsIGdldFByb3BzKCkpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCByZW5kZXJDb2RlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT1cImxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU1hcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQ29kZUJsb2NrIGxhbmd1YWdlPVwianN4XCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwianN4XCIpfS8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQ29kZUJsb2NrIGxhbmd1YWdlPVwianNcIiBjb250ZW50PXtnZW5lcmF0ZUNvZGUoXCJyZWFjdFwiKX0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBnZXRTdHJGb3JQcm9wID0gKHZhbHVlLCBjb21wUGF0aCwgbGFuZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKClcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS4kJHR5cGVvZiAmJiAodmFsdWUuJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IHZhbHVlLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvbXBQYXRoID09PSBcIkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRhYnNcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGFuZyA9PT0gXCJyZWFjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG4gICAgbWFyZ2luVG9wOiBcIjIwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjIwcHhcIlxyXG59fSxcclxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XHJcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcInZhcigtLWJhY2tncm91bmQtcHJpbWFyeSlcIixcclxuICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLFxyXG4gICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgfSwgY2xhc3NOYW1lOiBcImxjLXRhYi1ib3gtc2hhZG93XCIgfSxcclxuICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlLCBudWxsLCBcIlByZXZpZXcgdGFic1wiKVxyXG4gICAgKVxyXG4pYFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDxkaXYgc3R5bGU9e3tcclxuICAgICAgICBtYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbiAgICB9fT5cclxuICAgICAgICA8ZGl2IHN0eWxlPXt7XHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXByaW1hcnkpXCIsIFxyXG4gICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlByZXZpZXcgdGFiczwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGl0bGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIFwiICAgIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZ2VuZXJhdGVDb2RlID0gZnVuY3Rpb24obGFuZyl7IC8vIGNvZGUgZm9ybWF0dGluZyBpcyBoYXJkXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cylcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wQ2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmZpbmQoZSA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2NvbXBOYW1lXSlcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gZ2V0UHJvcHMoKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZihsYW5nID09PSBcImpzeFwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuUHJvcCA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGtleSA9PSBcImNoaWxkcmVuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuUHJvcCA9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0ga2V5K1wiPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIgKz0gSlNPTi5zdHJpbmdpZnkocHJvcHNba2V5XSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGB7JHtnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKX19YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9wZW5UYWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGRyZW5Qcm9wKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5UYWcgPSBgPCR7Y29tcFBhdGh9ICR7cHJvcFN0cmluZ3Muam9pbihcIiBcIil9PmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZVRhZyA9IGA8LyR7Y29tcFBhdGh9PmBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtvcGVuVGFnfVxcbiAgICAke2NoaWxkcmVuUHJvcH1cXG4ke2Nsb3NlVGFnfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuVGFnID0gYDwke2NvbXBQYXRofSAke3Byb3BTdHJpbmdzLmpvaW4oXCIgXCIpfS8+YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5UYWdcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IHByb3BzLmNoaWxkcmVuIHx8IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuICYmIGNoaWxkcmVuLiQkdHlwZW9mICYmIChjaGlsZHJlbi4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgY2hpbGRyZW4uJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBnZXRTdHJGb3JQcm9wKGNoaWxkcmVuLCBjb21wUGF0aCwgbGFuZylcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZpc2libGVLZXkgPSAvW15cXHdcXGRfXS9nLnRlc3Qoa2V5KSA/IEpTT04uc3RyaW5naWZ5KGtleSkgOiBrZXlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSB2aXNpYmxlS2V5K1wiOiBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByb3BzW2tleV0gPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IGdldFN0ckZvclByb3AocHJvcHNba2V5XSwgY29tcFBhdGgsIGxhbmcpLnNwbGl0KFwiXFxuXCIpLm1hcCgoc3RyLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgPT09IDApcmV0dXJuIHN0clxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgICAgXCIgKyBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKFwiXFxuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BPYmplY3QgPSBcIntcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihwcm9wU3RyaW5ncy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcFN0cmluZ3MuZm9yRWFjaCgoc3RyLCBpKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzTGFzdCA9IGkgPT09IHByb3BTdHJpbmdzLmxlbmd0aCAtIDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGkgPT09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighaXNGaXJzdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCIsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIlxcbiAgICBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNMYXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPVwiXFxufVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wT2JqZWN0ICs9IFwifVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuRGF0YSA9IHR5cGVvZiBjaGlsZHJlbiA9PT0gXCJzdHJpbmdcIiAmJiBjaGlsZHJlbi5zdGFydHNXaXRoKFwiUmVhY3QuY3JlYXRlRWxlbWVudFwiKSA/IGNoaWxkcmVuIDogSlNPTi5zdHJpbmdpZnkoY2hpbGRyZW4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgUmVhY3QuY3JlYXRlRWxlbWVudCgke2NvbXBQYXRofSwgJHtwcm9wT2JqZWN0fSwgJHtjaGlsZHJlbkRhdGF9KWBcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nc1RpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWV9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICB7QWxsUHJldmlld3MubWFwKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2F0ZWdvcnlbMF0ub25DbGljaylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihjYXRlZ29yeVswXS50ZXh0KXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLmNoaWxkcmVuKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5Lmxlbmd0aCA9PT0gMSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2tleX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gb3B0aW9ucz17Y2F0ZWdvcnkubWFwKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcIm9wdC1cIitpbmRleCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IEpTT04uc3RyaW5naWZ5KGVbT2JqZWN0LmtleXMoZSlbMF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfSB2YWx1ZT17XCJvcHQtXCIrKHN0YXRlLm9wdGlvbnNba2V5XSB8fCBcIjBcIil9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLm9wdGlvbnMsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldOiAodmFsdWUudmFsdWUgfHwgXCIwXCIpLnJlcGxhY2UoXCJvcHQtXCIsIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19IHNlYXJjaGFibGU9e3RydWV9Lz4sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPXt7bWFyZ2luQm90dG9tOiBcIjhweFwifX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cclxuICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRhYnMgdGFicz17W3tsYWJlbDogXCJQcmV2aWV3XCIsIGlkOiBcInByZXZpZXdcIn0sIHtsYWJlbDogXCJDb2RlXCIsIGlkOiBcImNvZGVcIn1dfSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlPXtzdGF0ZS50YWJ9IGNoaWxkcmVuPXtzdGF0ZS50YWIgPT09IFwicHJldmlld1wiID8gcmVuZGVyUHJldmlldygpIDogcmVuZGVyQ29kZSgpfSBvbkNoYW5nZT17b25DaGFuZ2V9Lz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PilcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlbmRlcnMoKXtcclxuXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xyXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIi4vaWNvbnMvZWRpdFwiO1xyXG5pbXBvcnQgRGVsZXRlSWNvbiBmcm9tIFwiLi9pY29ucy9kZWxldGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5pbXBvcnQgVG9vbHRpcFdyYXAgZnJvbSBcIi4vdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IHsgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5jb25zdCBhbmNob3JDbGFzc2VzID0gQkRWMi5hbmNob3JDbGFzc2VzO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1BsdWdpbkNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd1NldHRpbmdzID0gdGhpcy5zaG93U2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiAmJiB0eXBlb2YodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCkgPT09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICB0aGlzLnNldHRpbmdzUGFuZWwgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLmVkaXQgPSB0aGlzLmVkaXQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmRlbGV0ZSA9IHRoaXMuZGVsZXRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmVuYWJsZWQsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVsb2FkczogMCxcclxuICAgICAgICAgICAgdHJ1c3RlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzU2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3NPcGVuOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzUGFuZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtM1wiXSkgcmV0dXJuO1xyXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJzY3JvbGxlci1cXFwiXVwiKVxyXG4gICAgICAgICAgICBpZiAoIWlzSGlkZGVuKGNvbnRhaW5lciwgdGhpc05vZGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHRoaXNOb2RlT2Zmc2V0ID0gRE9NLm9mZnNldCh0aGlzTm9kZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lck9mZnNldCA9IERPTS5vZmZzZXQoY29udGFpbmVyKTtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSBjb250YWluZXIuc2Nyb2xsVG9wO1xyXG4gICAgICAgICAgICBjb25zdCBlbmRQb2ludCA9IHRoaXNOb2RlT2Zmc2V0LnRvcCAtIGNvbnRhaW5lck9mZnNldC50b3AgKyBjb250YWluZXIuc2Nyb2xsVG9wIC0gMzA7XHJcbiAgICAgICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZFBvaW50ID4gb3JpZ2luYWwpIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCArIChwcm9ncmVzcyAqIChlbmRQb2ludCAtIG9yaWdpbmFsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgLSAocHJvZ3Jlc3MgKiAob3JpZ2luYWwgLSBlbmRQb2ludCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZXR0aW5nc0NvbXBvbmVudCgpIHtcclxuICAgICAgICB0cnkgeyB0aGlzLnNldHRpbmdzUGFuZWwgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRTZXR0aW5nc1BhbmVsKCk7IH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZ2V0IHNldHRpbmdzIHBhbmVsIGZvciBcIiArIHRoaXMubmFtZSArIFwiLlwiLCBlcnIpOyB9XHJcblxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3Mtb3BlbiB1aS1zd2l0Y2gtaXRlbVwiLCByZWY6IFwiY2FyZE5vZGVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge3N0eWxlOiB7XCJmbG9hdFwiOiBcInJpZ2h0XCIsIFwiY3Vyc29yXCI6IFwicG9pbnRlclwifSwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsID09PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwifSksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgIT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCIsIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MOiB7X19odG1sOiB0aGlzLnNldHRpbmdzUGFuZWx9fSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGJ1aWxkVGl0bGUobmFtZSwgdmVyc2lvbiwgYXV0aG9yKSB7XHJcbiAgICAgICAgY29uc3QgdGl0bGUgPSBcInt7bmFtZX19IHZ7e3ZlcnNpb259fSBieSB7e2F1dGhvcn19XCIuc3BsaXQoLyh7e1tBLVphLXpdK319KS8pO1xyXG4gICAgICAgIGNvbnN0IG5hbWVJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e25hbWV9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVtuYW1lSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJuYW1lIGJkYS1uYW1lXCJ9LCBuYW1lKTtcclxuICAgICAgICBjb25zdCB2ZXJzaW9uSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3t2ZXJzaW9ufX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbdmVyc2lvbkluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwidmVyc2lvbiBiZGEtdmVyc2lvblwifSwgdmVyc2lvbik7XHJcbiAgICAgICAgY29uc3QgYXV0aG9ySW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3thdXRob3J9fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJhdXRob3IgYmRhLWF1dGhvclwifTtcclxuICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCkge1xyXG4gICAgICAgICAgICAgICAgcHJvcHMuY2xhc3NOYW1lICs9IGAgJHthbmNob3JDbGFzc2VzLmFuY2hvcn0gJHthbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YDtcclxuICAgICAgICAgICAgICAgIHByb3BzLnRhcmdldCA9IFwiX2JsYW5rXCI7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5saW5rKSBwcm9wcy5ocmVmID0gYXV0aG9yLmxpbms7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmlkKSBwcm9wcy5vbkNsaWNrID0gKCkgPT4ge0JEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpOyBCRFYyLm9wZW5ETShhdXRob3IuaWQpO307XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGl0bGVbYXV0aG9ySW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChhdXRob3IubGluayB8fCBhdXRob3IuaWQgPyBcImFcIiA6IFwic3BhblwiLCBwcm9wcywgYXV0aG9yLm5hbWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGl0bGUuZmxhdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VMaW5rKHRpdGxlLCB1cmwpIHtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYmRhLWxpbmsgYmRhLWxpbmstd2Vic2l0ZVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9O1xyXG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcInN0cmluZ1wiKSBwcm9wcy5ocmVmID0gdXJsO1xyXG4gICAgICAgIGlmICh0eXBlb2YodXJsKSA9PSBcImZ1bmN0aW9uXCIpIHByb3BzLm9uQ2xpY2sgPSAoZXZlbnQpID0+IHtldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgdXJsKCk7fTtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYVwiLCBwcm9wcywgdGl0bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIG1ha2VCdXR0b24odGl0bGUsIGNoaWxkcmVuLCBhY3Rpb24pIHtcclxuICAgICAgICByZXR1cm4gPFRvb2x0aXBXcmFwIGNvbG9yPVwiYmxhY2tcIiBzaWRlPVwidG9wXCIgdGV4dD17dGl0bGV9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWJ1dHRvblwiIG9uQ2xpY2s9e2FjdGlvbn0+e2NoaWxkcmVufTwvZGl2PlxyXG4gICAgICAgIDwvVG9vbHRpcFdyYXA+O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XHJcbiAgICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxpbmtzKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gW107XHJcbiAgICAgICAgY29uc3QgYWRkb24gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG4gICAgICAgIGlmIChhZGRvbi53ZWJzaXRlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJXZWJzaXRlXCIsIGFkZG9uLndlYnNpdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24uc291cmNlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTb3VyY2VcIiwgYWRkb24uc291cmNlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLmludml0ZSkge1xyXG4gICAgICAgICAgICBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJTdXBwb3J0IFNlcnZlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0ZXIgPSAvXFwuZ2dcXC8oLiopJC87XHJcbiAgICAgICAgICAgICAgICBsZXQgY29kZSA9IGFkZG9uLmludml0ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZXN0ZXIudGVzdChjb2RlKSkgY29kZSA9IGNvZGUubWF0Y2godGVzdGVyKVsxXTtcclxuICAgICAgICAgICAgICAgIEJEVjIuTGF5ZXJTdGFjay5wb3BMYXllcigpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoY29kZSk7XHJcbiAgICAgICAgICAgIH0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGFkZG9uLmRvbmF0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiRG9uYXRlXCIsIGFkZG9uLmRvbmF0ZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5wYXRyZW9uKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJQYXRyZW9uXCIsIGFkZG9uLnBhdHJlb24pKTtcclxuICAgICAgICByZXR1cm4gbGlua3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IHRoaXMubGlua3M7XHJcbiAgICAgICAgcmV0dXJuIChsaW5rcy5sZW5ndGggfHwgdGhpcy5oYXNTZXR0aW5ncykgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZC1mb290ZXIgYmRhLWZvb3RlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWxpbmtzIGJkYS1saW5rc1wifSxcclxuICAgICAgICAgICAgICAgIC4uLihsaW5rcy5tYXAoKGVsZW1lbnQsIGluZGV4KSA9PiBpbmRleCA8IGxpbmtzLmxlbmd0aCAtIDEgPyBbZWxlbWVudCwgXCIgfCBcIl0gOiBlbGVtZW50KS5mbGF0KCkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtvbkNsaWNrOiB0aGlzLnNob3dTZXR0aW5ncywgY2xhc3NOYW1lOiBcImJkLWJ1dHRvbiBiZGEtc2V0dGluZ3MtYnV0dG9uXCIsIGRpc2FibGVkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSwgXCJTZXR0aW5nc1wiKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy50b2dnbGUgJiYgdGhpcy5wcm9wcy50b2dnbGUodGhpcy5uYW1lKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiAhdGhpcy5zdGF0ZS5jaGVja2VkfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdCgpIHt0aGlzLnByb3BzLmVkaXQodGhpcy5uYW1lKTt9XHJcbiAgICBkZWxldGUoKSB7dGhpcy5wcm9wcy5yZW1vdmUodGhpcy5uYW1lKTt9XHJcbiAgICByZWxvYWQoKSB7dGhpcy5wcm9wcy5yZWxvYWQodGhpcy5uYW1lKTt9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogdGhpcy5wcm9wcy5hZGRvbi5uYW1lKTt9XHJcbiAgICBnZXQgYXV0aG9yKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogdGhpcy5wcm9wcy5hZGRvbi5hdXRob3IpO31cclxuICAgIGdldCBkZXNjcmlwdGlvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXREZXNjcmlwdGlvbigpIDogdGhpcy5wcm9wcy5hZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0IHZlcnNpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogdGhpcy5wcm9wcy5hZGRvbi52ZXJzaW9uKTt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm4gdGhpcy5zZXR0aW5nc0NvbXBvbmVudDtcclxuICAgICAgICBjb25zdCB7YXV0aG9ySWQsIGF1dGhvckxpbmt9ID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuXHJcbiAgICAgICAgY29uc3Qgc3R5bGUgPSB7fVxyXG4gICAgICAgIGlmKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy02XCJdKXtcclxuICAgICAgICAgICAgaWYoIXRoaXMuaXNTY2FubmluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzU2Nhbm5pbmcgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShyZXNvbHZlKHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUuZW5kc1dpdGgoXCIucGx1Z2luLmpzXCIpID8gY29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IGNvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgdGhpcy5wcm9wcy5hZGRvbi5maWxlbmFtZSksIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnVubW91bnRlZClyZXR1cm5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IHJlc3VsdC5zdXNwZWN0ID8gXCJzdXNwZWN0XCIgOiB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sICgpID0+IHt9KVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuaXNUcnVzdGVkID09PSB0cnVlKXtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gXCJzdXNwZWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLWNsb3NlZCB1aS1zd2l0Y2gtaXRlbVwiLCBzdHlsZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWhlYWRlciBiZGEtaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtdGl0bGUgYmRhLWhlYWRlci10aXRsZVwifSwgdGhpcy5idWlsZFRpdGxlKHRoaXMubmFtZSwgdGhpcy52ZXJzaW9uLCB7bmFtZTogdGhpcy5hdXRob3IsIGlkOiBhdXRob3JJZCwgbGluazogYXV0aG9yTGlua30pKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1jb250cm9scyBiZGEtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMuZWRpdCAmJiB0aGlzLm1ha2VCdXR0b24oXCJFZGl0XCIsIDxFZGl0SWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZWRpdCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVtb3ZlICYmIHRoaXMubWFrZUJ1dHRvbihcIkRlbGV0ZVwiLCA8RGVsZXRlSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMuZGVsZXRlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZWxvYWQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiUmVsb2FkXCIsIDxSZWxvYWRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5yZWxvYWQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge29uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXItd3JhcCBiZGEtZGVzY3JpcHRpb24td3JhcCBzY3JvbGxlci13cmFwIGZhZGVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlciBiZC1hZGRvbi1kZXNjcmlwdGlvbiBiZGEtZGVzY3JpcHRpb24gc2Nyb2xsZXJcIn0sIHRoaXMuZGVzY3JpcHRpb24pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHRoaXMuZm9vdGVyXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsiLCJpbXBvcnQgRXJyb3JCb3VuZGFyeSBmcm9tIFwiLi9lcnJvckJvdW5kYXJ5XCI7XHJcbmltcG9ydCBDb250ZW50Q29sdW1uIGZyb20gXCIuL2NvbnRlbnRDb2x1bW5cIjtcclxuaW1wb3J0IFRvb2xzIGZyb20gXCIuL3Rvb2xzXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuL3Njcm9sbGVyXCI7XHJcbmltcG9ydCBEcm9wZG93biBmcm9tIFwiLi9jb21wb25lbnRzL2Ryb3Bkb3duXCI7XHJcbmltcG9ydCBTZWFyY2ggZnJvbSBcIi4vY29tcG9uZW50cy9zZWFyY2hcIjtcclxuXHJcbmltcG9ydCB7c2V0dGluZ3NDb29raWUsIHBsdWdpbkNvb2tpZSwgdGhlbWVDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4uL21vZHVsZXMvY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgQmRBcGkgZnJvbSBcIi4uL21vZHVsZXMvYmRBcGlcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvcGVuRm9sZGVyKCkge1xyXG4gICAgICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbSh0aGlzLmlzUGx1Z2lucyA/IENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBDb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQobmFtZSkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKG5hbWUpO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5lZGl0KG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgY29uc3Qgc2hvdWxkRGVsZXRlID0gYXdhaXQgdGhpcy5jb25maXJtRGVsZXRlKG5hbWUpO1xyXG4gICAgICAgIGlmICghc2hvdWxkRGVsZXRlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmRlbGV0ZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25maXJtRGVsZXRlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbChcIkFyZSBZb3UgU3VyZT9cIiwgYEFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgJHtuYW1lfT9gLCB7XHJcbiAgICAgICAgICAgICAgICBkYW5nZXI6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEZWxldGVcIixcclxuICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge3Jlc29sdmUodHJ1ZSk7fSxcclxuICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7cmVzb2x2ZShmYWxzZSk7fVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc29ydE9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge2xhYmVsOiBcIk5hbWVcIiwgdmFsdWU6IFwibmFtZVwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkF1dGhvclwiLCB2YWx1ZTogXCJhdXRob3JcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJWZXJzaW9uXCIsIHZhbHVlOiBcInZlcnNpb25cIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJSZWNlbnRseSBBZGRlZFwiLCB2YWx1ZTogXCJhZGRlZFwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkxhc3QgTW9kaWZpZWRcIiwgdmFsdWU6IFwibW9kaWZpZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJGaWxlIFNpemVcIiwgdmFsdWU6IFwic2l6ZVwifSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkaXJlY3Rpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBc2NlbmRpbmdcIiwgdmFsdWU6IHRydWV9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRGVzY2VuZGluZ1wiLCB2YWx1ZTogZmFsc2V9XHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnNlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YXNjZW5kaW5nOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNvcnQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzb3J0OiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaChldmVudCkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3F1ZXJ5OiBldmVudC50YXJnZXQudmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByb3BzKGFkZG9uKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAga2V5OiB0aGlzLmdldE5hbWUoYWRkb24pLFxyXG4gICAgICAgICAgICBlbmFibGVkOiB0aGlzLmNvb2tpZVt0aGlzLmdldE5hbWUoYWRkb24pXSxcclxuICAgICAgICAgICAgdG9nZ2xlOiB0aGlzLm1hbmFnZXIudG9nZ2xlLmJpbmQodGhpcy5tYW5hZ2VyKSxcclxuICAgICAgICAgICAgLy9lZGl0OiB0aGlzLmVkaXQuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgcmVtb3ZlOiB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICBhZGRvbjogYWRkb24sXHJcbiAgICAgICAgICAgIGhhc2g6IGFkZG9uLmhhc2hcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlzdCgpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLnR5cGUgPT09IFwicGx1Z2luc1wiID8gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpIDogT2JqZWN0LnZhbHVlcyhiZHRoZW1lcyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWRkb25zKCkge1xyXG4gICAgICAgIGNvbnN0IHNvcnRlZEFkZG9ucyA9IHRoaXMubGlzdC5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhcCA9IHRoaXMuc3RhdGUuc29ydC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRoaXMuc3RhdGUuc29ydC5zbGljZSgxKTtcclxuICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhLnBsdWdpbiAmJiBhLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhhLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgOiBhW3RoaXMuc3RhdGUuc29ydF07XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiBiW3RoaXMuc3RhdGUuc29ydF07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YoZmlyc3QpID09IFwic3RyaW5nXCIpIHJldHVybiBmaXJzdC50b0xvY2FsZUxvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoc2Vjb25kLnRvTG9jYWxlTG93ZXJDYXNlKCkpO1xyXG4gICAgICAgICAgICBpZiAoZmlyc3QgPiBzZWNvbmQpIHJldHVybiAxO1xyXG4gICAgICAgICAgICBpZiAoc2Vjb25kID4gZmlyc3QpIHJldHVybiAtMTtcclxuICAgICAgICAgICAgcmV0dXJuIDA7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLmFzY2VuZGluZykgc29ydGVkQWRkb25zLnJldmVyc2UoKTtcclxuICAgICAgICBjb25zdCByZW5kZXJlZCA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgc29ydGVkQWRkb25zLmxlbmd0aDsgYSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZG9uID0gc29ydGVkQWRkb25zW2FdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5xdWVyeSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0TmFtZShhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhdXRob3IgPSB0aGlzLmdldEF1dGhvcihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHRoaXMuZ2V0RGVzY3JpcHRpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmVyc2lvbiA9IHRoaXMuZ2V0VmVyc2lvbihhZGRvbik7XHJcbiAgICAgICAgICAgICAgICBpZiAobmFtZSkgbWF0Y2hlcyA9IG5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IpIG1hdGNoZXMgPSBtYXRjaGVzIHx8IGF1dGhvci50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBkZXNjcmlwdGlvbi50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuc3RhdGUucXVlcnkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIG1hdGNoZXMgPSBtYXRjaGVzIHx8IHZlcnNpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlcykgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLmdldFByb3BzKGFkZG9uKTtcclxuICAgICAgICAgICAgcmVuZGVyZWQucHVzaCg8RXJyb3JCb3VuZGFyeT48QWRkb25DYXJkIHsuLi5wcm9wc30gcmVsb2FkPXshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgdGhpcy5tYW5hZ2VyLnJlbG9hZC5iaW5kKHRoaXMubWFuYWdlcil9IC8+PC9FcnJvckJvdW5kYXJ5Pik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZW5kZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXROYW1lKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXROYW1lKCkgOiBhZGRvbi5uYW1lKTt9XHJcbiAgICBnZXRBdXRob3IoYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldEF1dGhvcigpIDogYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXREZXNjcmlwdGlvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IGFkZG9uLmRlc2NyaXB0aW9uKTt9XHJcbiAgICBnZXRWZXJzaW9uKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRWZXJzaW9uKCkgOiBhZGRvbi52ZXJzaW9uKTt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHJlZnJlc2hJY29uID0gPFRvb2x0aXAgY29sb3I9XCJibGFja1wiIHBvc2l0aW9uPVwidG9wXCIgdGV4dD1cIlJlbG9hZCBMaXN0XCI+XHJcbiAgICAgICAgICAgIHsocHJvcHMpID0+IFxyXG4gICAgICAgICAgICA8UmVsb2FkSWNvbiB7Li4ucHJvcHN9IGNsYXNzTmFtZT1cImJkLWljb24gYmQtcmVsb2FkIGJkLXJlbG9hZC1oZWFkZXJcIiBzaXplPVwiMThweFwiIG9uQ2xpY2s9e2FzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUGx1Z2lucykgcGx1Z2luTW9kdWxlLnVwZGF0ZVBsdWdpbkxpc3QoKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgdGhlbWVNb2R1bGUudXBkYXRlVGhlbWVMaXN0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XHJcbiAgICAgICAgICAgIH19IC8+XHJcbiAgICAgICAgICAgIH08L1Rvb2x0aXA+O1xyXG4gICAgICAgIGNvbnN0IGFkZG9uQ2FyZHMgPSB0aGlzLmdldEFkZG9ucygpO1xyXG5cclxuICAgICAgICByZXR1cm4gPENvbnRlbnRDb2x1bW4gdGl0bGU9e2Ake3RoaXMucHJvcHMudHlwZS50b1VwcGVyQ2FzZSgpfeKAlCR7YWRkb25DYXJkcy5sZW5ndGh9YH0+XHJcbiAgICAgICAgICAgIDxidXR0b24ga2V5PVwiZm9sZGVyLWJ1dHRvblwiIGNsYXNzTmFtZT1cImJkLWJ1dHRvbiBiZC1wZmJ0blwiIG9uQ2xpY2s9e3RoaXMub3BlbkZvbGRlci5iaW5kKHRoaXMpfT5PcGVuIHt0aGlzLmlzUGx1Z2lucyA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCJ9IEZvbGRlcjwvYnV0dG9uPlxyXG4gICAgICAgICAgICB7IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHJlZnJlc2hJY29ufVxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWNvbnRyb2xzIGJkLWFkZG9uLWNvbnRyb2xzXCI+XHJcbiAgICAgICAgICAgICAgICA8U2VhcmNoIG9uQ2hhbmdlPXt0aGlzLnNlYXJjaH0gcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHt0aGlzLnByb3BzLnR5cGV9Li4uYH0gLz5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tZHJvcGRvd25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5Tb3J0IGJ5OjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLnNvcnRPcHRpb25zfSBvbkNoYW5nZT17dGhpcy5zb3J0fSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJiZC1sYWJlbFwiPk9yZGVyOjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEcm9wZG93biBvcHRpb25zPXt0aGlzLmRpcmVjdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnJldmVyc2V9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkYS1zbGlzdCBiZC1hZGRvbi1saXN0XCI+e2FkZG9uQ2FyZHN9PC9kaXY+XHJcbiAgICAgICAgPC9Db250ZW50Q29sdW1uPlxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IENhcmRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYXJkTGlzdC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRMb2dvIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwibWV0YWRhdGFcIiwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxNVwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzNcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjEwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzMpXCJ9LCBkOiBcIk0xMTk1LjQ0KzEzNS40NDJMMTE5NS40NCsxMzUuNDQyTDk5Ny42KzEzNi40NDJDMTAyNC4yKzE0OS43NDIrMTE3MC4zNCsxNjMuNTQyKzExOTMuNjQrMTc5Ljc0MkMxMjY0LjM0KzIyOC44NDIrMTMxOS43NCsyOTEuMjQyKzEzNTguMjQrMzY1LjA0MkMxMzk4LjE0KzQ0MS42NDIrMTQxOS43NCs1MzAuNjQyKzE0MjIuNTQrNjI5LjY0MkwxNDIyLjU0KzYzMC44NDJMMTQyMi41NCs2MzIuMDQyQzE0MjIuNTQrNzczLjE0MisxNDIyLjU0KzEyMjguMTQrMTQyMi41NCsxMzY5LjE0TDE0MjIuNTQrMTM3MC4zNEwxNDIyLjU0KzEzNzEuNTRDMTQxOS44NCsxNDcwLjU0KzEzOTguMjQrMTU1OS41NCsxMzU4LjI0KzE2MzYuMTRDMTMxOS43NCsxNzA5Ljk0KzEyNjQuNDQrMTc3Mi4zNCsxMTkzLjY0KzE4MjEuNDRDMTE3MS4wNCsxODM3LjE0KzEwMjUuNysxODUwLjU0KzEwMDArMTg2My41NEwxMTkzLjU0KzE4NjQuNTRDMTUzOS43NCsxODY2LjQ0KzE4NjQuNTQrMTY5My4zNCsxODY0LjU0KzEyOTYuNjRMMTg2NC41NCs3MTYuOTQyQzE4NjYuNDQrMzEyLjQ0MisxNTQxLjY0KzEzNS40NDIrMTE5NS40NCsxMzUuNDQyWlwiLCBmaWxsOiBcIiMxNzE3MTdcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzEpXCJ9LCBkOiBcIk0xNDY5LjI1KzYzMS40NDJDMTQ1OS41NSsyNzguMDQyKzExODMuMDUrMTM1LjQ0Mis4MjYuNjUrMTM1LjQ0MkwxMzUuNDUrMTM1LjQ0MkwxMzUuNDUrMTAwNEMxMzUuNDUrMTAwNCsxMzUuNDI3KzEyNTUuMjErMzU1LjYyNisxMjU1LjIxQzU3NS44MjUrMTI1NS4yMSs1NzUuODQ4KzEwMDQrNTc1Ljg0OCsxMDA0TDU3Ny40NSs0OTAuNDQyTDgzNC40NSs0OTAuNDQyQzExMDguOTUrNDkwLjQ0MisxMTA4Ljk1KzgzNS4zNDIrODM0LjQ1KzgzNS4zNDJMNjY0LjY1KzgzNS4zNDJMNjY0LjY1KzExNjQuODRMODM0LjQ1KzExNjQuODRDOTIzLjkzMisxMTY0Ljg0Kzk4NC4yNDQrMTIwMS40OCsxMDE1LjM5KzEyNTAuODdDMTA3OS43OCsxMzUzKzEwMTkuNDcrMTUwOS42NCs4MzQuNDUrMTUwOS42NEwxMzUuNDUrMTUwOS42NEwxMzUuNDUrMTg2NC41NEw4MjYuNjUrMTg2NC41NEMxMTgyLjk1KzE4NjQuNTQrMTQ1OS40NSsxNzIxLjk0KzE0NjkuMjUrMTM2OC41NEMxNDY5LjI1KzEyMDUuOTQrMTQyNC43NSsxMDg0LjQ0KzEzNDYuMzUrOTk5Ljk0MkMxNDI0Ljc1KzkxNS41NDIrMTQ2OS4yNSs3OTQuMDQyKzE0NjkuMjUrNjMxLjQ0MlpcIiwgZmlsbDogXCIjRkZGRkZGXCIsIG9wYWNpdHk6IFwiMVwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NoZWNrYm94IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImxpXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94IFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3gsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWlubmVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94SW5uZXIpWzBdLmNoZWNrYm94SW5uZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi4vaWNvbnMvZG93bmFycm93XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XHJcbiAgICAgICAgdGhpcy5kcm9wZG93biA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZGVNZW51ID0gdGhpcy5oaWRlTWVudS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dNZW51KGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZU1lbnUoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3RlZCgpIHtyZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09IHRoaXMuc3RhdGUudmFsdWUpO31cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LW9wdGlvbnNcIj5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qtb3B0aW9uJHtzZWxlY3RlZC52YWx1ZSA9PSBvcHQudmFsdWUgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gfSBvbkNsaWNrPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcywgb3B0LnZhbHVlKX0+e29wdC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZSA9PSBcInRyYW5zcGFyZW50XCIgPyBcIiBiZC1zZWxlY3QtdHJhbnNwYXJlbnRcIiA6IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5zdGF0ZS5vcGVuID8gXCIgbWVudS1vcGVuXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuLy8gcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBcIj5cclxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cclxuLy8gPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbi8vICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbi8vICAgICA8L2Rpdj5cclxuLy8gPC9kaXY+XHJcbi8vIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4vLyA8L2Rpdj47IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWFyY2gtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0gb25LZXlEb3duPXt0aGlzLnByb3BzLm9uS2V5RG93bn0gdHlwZT1cInRleHRcIiBjbGFzc05hbWU9XCJiZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gbWF4TGVuZ3RoPVwiNTBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTZWFyY2hJY29uIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7Y2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkfTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuU3dpdGNoIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB2YWx1ZT17dGhpcy5zdGF0ZS5jaGVja2VkfSAvPlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMucHJvcHMudGl0bGUgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHRoaXMucHJvcHMudGl0bGUpIDogbnVsbFxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGNvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbiArIFwiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLCBzdHlsZToge3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0sXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5wcm9wcy5saW5lcyA9IDA7XHJcbiAgICAgICAgc2VsZi5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2hlZEVkaXRvciA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQ3NzRWRpdG9yRGV0YWNoZWQsIHthdHRhY2g6IHNlbGYuYXR0YWNofSk7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoID0gc2VsZi5kZXRhY2guYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRoaXMucHJvcHMuZGV0YWNoZWQgfHwgQkRWMi5lZGl0b3JEZXRhY2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9tb25va2FpXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChwcmV2U3RhdGUuZGV0YWNoZWQgJiYgIXNlbGYuc3RhdGUuZGV0YWNoZWQpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYuZGV0YWNoZWRSb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29kZU1pcnJvcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gYXRvYihfY2Nzcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBjY3NzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcblxyXG4gICAgICAgIGNvbnN0IHtkZXRhY2hlZH0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiZWRpdG9yLWRldGFjaGVkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImgzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAhZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBkZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlByZXNzIFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcIixcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhhcmcpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGFyZykge1xyXG4gICAgICAgICAgICBjYXNlIFwidXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJzYXZlXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwiZGV0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBzZWxmLmRldGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgYnRvYSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpKTtcclxuICAgIH1cclxuXHJcbiAgICBkZXRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgZHJvb3QgPSBzZWxmLmRldGFjaGVkUm9vdDtcclxuICAgICAgICBpZiAoIWRyb290KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiRkFJTEVEIFRPIElOSkVDVCBST09UOiAuYXBwXCIpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNlbGYuZGV0YWNoZWRFZGl0b3IsIGRyb290KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdERldGFjaGVkUm9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0RGV0YWNoZWRSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcC5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhdHRhY2goKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBTZXR0aW5ncyBmcm9tIFwiLi4vbW9kdWxlcy9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYub25DaGFuZ2UgPSBzZWxmLm9uQ2hhbmdlLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSB0cnVlO1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvbW9ub2thaVwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICBET00ucmVtb3ZlQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IGF0b2IoX2Njc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2NzcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3RSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGNvbnN0IGFwcCA9IERPTS5xdWVyeShcIi5hcHAsIC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5hcHAgJiYgZS5sYXllcnMpWzBdLmFwcC5zcGxpdChcIiBcIilbMF0pO1xyXG4gICAgICAgIGlmICghYXBwKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgRE9NLmluc2VydEFmdGVyKERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGlkPVwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIj5gKSwgYXBwKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJiZC1kZXRhY2hlZC1jc3MtZWRpdG9yXCIsIGlkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtZWRpdG9yXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1pbm5lcnBhbmVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3ItZGV0YWNoZWRcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogc2VsZi5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImF0dGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiQXR0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKGlkLCBjaGVja2VkKSB7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwibGl2ZS11cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdID0gY2hlY2tlZDtcclxuICAgICAgICAgICAgICAgIFNldHRpbmdzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soaWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJhdHRhY2hcIjpcclxuICAgICAgICAgICAgICAgIGlmIChET00ucXVlcnkoXCIjZWRpdG9yLWRldGFjaGVkXCIpKSBzZWxmLnByb3BzLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYucm9vdCk7XHJcbiAgICAgICAgICAgICAgICBzZWxmLnJvb3QucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBidG9hKHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSkpO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEJERXJyb3JCb3VuZGFyeSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICB0aGlzLnN0YXRlID0ge2hhc0Vycm9yOiBmYWxzZX07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkQ2F0Y2goKSB7XHJcbiAgICAgIHRoaXMuc2V0U3RhdGUoe2hhc0Vycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICBpZiAodGhpcy5zdGF0ZS5oYXNFcnJvcikgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInJlYWN0LWVycm9yXCJ9LCBcIkNvbXBvbmVudCBFcnJvclwiKTsgIFxyXG4gICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjsgXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCREVycm9yQm91bmRhcnkucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsgIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERlbGV0ZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25BcnJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNOC4xMiA5LjI5TDEyIDEzLjE3bDMuODgtMy44OGMuMzktLjM5IDEuMDItLjM5IDEuNDEgMCAuMzkuMzkuMzkgMS4wMiAwIDEuNDFsLTQuNTkgNC41OWMtLjM5LjM5LTEuMDIuMzktMS40MSAwTDYuNyAxMC43Yy0uMzktLjM5LS4zOS0xLjAyIDAtMS40MS4zOS0uMzggMS4wMy0uMzkgMS40MiAwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFZGl0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjRkZGRkZGXCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfT5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMyAxNy4yNVYyMWgzLjc1TDE3LjgxIDkuOTRsLTMuNzUtMy43NUwzIDE3LjI1ek0yMC43MSA3LjA0Yy4zOS0uMzkuMzktMS4wMiAwLTEuNDFsLTIuMzQtMi4zNGMtLjM5LS4zOS0xLjAyLS4zOS0xLjQxIDBsLTEuODMgMS44MyAzLjc1IDMuNzUgMS44My0xLjgzelwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIgLz5cclxuICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59Iiwiey8qIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIiB3aWR0aD1cIjE4cHhcIiBoZWlnaHQ9XCIxOHB4XCI+XHJcbiAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxyXG48L3N2Zz4gKi99XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGlzdG9yeSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE4cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIiNGRkZGRkZcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiIGZpbGw9XCJub25lXCIvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6XCIvPlxyXG4gICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cIiNGRkZGRkZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXJnaW5Ub3AgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZSltYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Ub3A2MH0+PC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzR3JvdXAgZnJvbSBcIi4vc2V0dGluZ3NHcm91cFwiO1xyXG5pbXBvcnQgZGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0UlBDLCBzZXR0aW5nc1JQQyB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQ3VzdG9tUmljaFByZXNlbmNlIGZyb20gXCIuLi9tb2R1bGVzL0N1c3RvbVJpY2hQcmVzZW5jZVwiXHJcbmltcG9ydCB0aW1lc3RhbXBSZW5kZXIgZnJvbSBcIi4vdGltZXN0YW1wUmVuZGVyXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcblxyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHJlc2VuY2VTZXR0aW5ncyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxyXG4gICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpZXcgPSBudWxsXHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzID0gbmV3IFNldCgpXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlV2hlbkZldGNoZWQoY29tcCl7XHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuYWRkKGNvbXApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SW5wdXRUZXh0fSBzZXR0aW5nIFxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRTZXR0aW5nID0gUlBDUHJvcHMuZmluZChlID0+IGUuaWQgPT09IHNldHRpbmcucHJvcHMuaWQpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCB0aGlzLnN0YXRlLmRhdGEsIHtcclxuICAgICAgICAgICAgICAgIFtkZWZhdWx0U2V0dGluZy5pZF06ICEhdmFsdWUgPyB2YWx1ZSA6IG51bGxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5zdGF0ZS5hc3NldHNcclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKClcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxyXG4gICAgfVxyXG5cclxuICAgIGZldGNoQXNzZXRzKCl7XHJcbiAgICAgICAgaWYodGhpcy5pc2ZldGNoaW5nID09PSB0cnVlKXtcclxuICAgICAgICAgICAgbGV0IGFwcCA9IHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCAhPT0gYXBwKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IHRydWVcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZmV0Y2hBc3NldHModGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKVxyXG4gICAgICAgIC50aGVuKGFzc2V0cyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBPYmplY3Qua2V5cyhhc3NldHMpLm1hcChrID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXNzZXQgPSBhc3NldHNba11cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogYXNzZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVByZXZpZXcoZGF0YSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGFcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyB8fCAoVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcIlJlcmVuZGVyaW5nIHJwYyBtYW5hZ2VyXCIpXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NHcm91cCB0aXRsZT1cIlJpY2hQcmVzZW5jZSBTZXR0aW5nc1wiIHNldHRpbmdzPXt0aGlzLnByb3BzLnNldHRpbmdzfSBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0vPixcclxuICAgICAgICAgICAgPE1hcmdpblRvcCAvPixcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJSaWNoUHJlc2VuY2VcIi8+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgey8qKiBvcHRpb25zICovfVxyXG4gICAgICAgICAgICAgICAge3RoaXMub3B0aW9uc0NvbXBvbmVudHN9XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3AgLz5cclxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUHJldmlld1wiLz5cclxuICAgICAgICAgICAgICAgIHsvKiogcHJldmlldyAqL31cclxuICAgICAgICAgICAgICAgIDxScGNQcmV2aWV3IHNldHRpbmdzPXt0aGlzfS8+XHJcbiAgICAgICAgICAgIDwvZGl2PixcclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+LFxyXG4gICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9e3dpbmRvdy5vaGdvZG9oZnVja30+XHJcbiAgICAgICAgICAgICAgICBPaCBnb2QgT2ggZnVja1xyXG4gICAgICAgICAgICA8L2J1dHRvbj4sXHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9TGtZYTdycHNfZzRcIilcclxuICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICBTZWUgPyBJIHB1bGxlZCBhIGxpdGxlIHNuZWFreSBvbiB5YVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnNDb21wb25lbnRzKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnNDb21wb25lbnRzIHx8ICh0aGlzLl9vcHRpb25zQ29tcG9uZW50cyA9IFJQQ1Byb3BzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgaWYoZS50eXBlID09PSBcInRleHRcIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gPElucHV0VGV4dCBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0vPlxyXG4gICAgICAgICAgICB9ZWxzZSBpZihlLnR5cGUgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gWzxJbnB1dE51bWJlciBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0vPl0vKlxyXG4gICAgICAgICAgICAgICAgaWYoZS5pZCA9PT0gXCJ0aW1lc3RhbXBzLnN0YXJ0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGFycmF5LnVuc2hpZnQoPERpc2NvcmRCdXR0b24gdGl0bGU9XCJDb3B5IEN1cnJlbnQgVGltZXN0YW1wXCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcclxuICAgICAgICAgICAgICAgICAgICB9fSAvPilcclxuICAgICAgICAgICAgICAgIH0qL1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJjaG9pY2VcIil7XHJcbiAgICAgICAgICAgICAgICBpZihbXCJhc3NldHMuc21hbGxcIiwgXCJhc3NldHMubGFyZ2VcIl0uaW5jbHVkZXMoZS5pZCkpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRDaG9pY2Ugc2V0dGluZz17ZX0gbWFuYWdlcj17dGhpc30gaWQ9e2UuaWR9IGNob2ljZXM9e1t7dmFsdWU6IFwibm9uZVwiLCBsYWJlbDogXCJObyBhc3NldHNcIn1dLmNvbmNhdCh0aGlzLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpfS8+XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJVbmtub3duIGNob2ljZS5cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkpXHJcbiAgICB9XHJcbn1cclxuY29uc3QgUlBDUHJvcHMgPSBbXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiQXBwbGljYXRpb24gSURcIixcclxuICAgICAgICBpZDogXCJhcHBsaWNhdGlvbl9pZFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiNzExNDE2OTU3NzE4NzU3NDE4XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiTmFtZVwiLFxyXG4gICAgICAgIGlkOiBcIm5hbWVcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJEZXRhaWxzXCIsXHJcbiAgICAgICAgaWQ6IFwiZGV0YWlsc1wiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkJyb3dzaW5nIERpc2NvcmRcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTdGF0ZVwiLFxyXG4gICAgICAgIGlkOiBcInN0YXRlXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiTGlnaHRjb3JkIENsaWVudFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlRpbWVzdGFtcCBTdGFydFwiLFxyXG4gICAgICAgIGlkOiBcInRpbWVzdGFtcHMuc3RhcnRcIixcclxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxyXG4gICAgICAgIGdldCBwbGFjZWhvbGRlcigpe1xyXG4gICAgICAgICAgICByZXR1cm4gRGF0ZS5ub3coKVxyXG4gICAgICAgIH1cclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiTGFyZ2VBc3NldFwiLFxyXG4gICAgICAgIGlkOiBcImFzc2V0cy5sYXJnZVwiLFxyXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiU21hbGxBc3NldFwiLFxyXG4gICAgICAgIGlkOiBcImFzc2V0cy5zbWFsbFwiLFxyXG4gICAgICAgIHR5cGU6IFwiY2hvaWNlXCJcclxuICAgIH0sXHJcbl1cclxuXHJcbmxldCBpbnB1dFRleHRNb2R1bGVzXHJcbmNsYXNzIElucHV0VGV4dCBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICBpZihpbnB1dFRleHRNb2R1bGVzICYmIGlucHV0VGV4dE1vZHVsZXNbMF0pcmV0dXJuIGlucHV0VGV4dE1vZHVsZXNcclxuICAgICAgICByZXR1cm4gaW5wdXRUZXh0TW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXSxcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaW5wdXQgPSA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuVGV4dElucHV0IHBsYWNlaG9sZGVyPXtzZXR0aW5nLnBsYWNlaG9sZGVyfSBuYW1lPXtzZXR0aW5nLmlkfSB2YWx1ZT17dGhpcy5zdGF0ZS5kYXRhfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfX0gdHlwZT1cInRleHRcIi8+XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlLFxyXG4gICAgICAgICAgICBpbnB1dE1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZTIsXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAge3RoaXMuaW5wdXR9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgSW5wdXROdW1iZXJNb2R1bGVzXHJcbmNsYXNzIElucHV0TnVtYmVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBJbnB1dE51bWJlck1vZHVsZXMgfHwgKElucHV0TnVtYmVyTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuaW5wdXRNaW5pKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTE2ICYmIGUuc2l6ZTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JUcmFuc3BhcmVudClbMF0sXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IHR5cGU9XCJudW1iZXJcIiBvbkNoYW5nZT17KHZhbHVlLCBuYW1lLCBpbnB1dCkgPT4ge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL1teXFxkXSsvZywgXCJcIilcclxuICAgICAgICAgICAgaWYodmFsdWUgPT0gdGhpcy5zdGF0ZS5kYXRhKXtcclxuICAgICAgICAgICAgICAgIGlucHV0LnNldFZhbHVlKHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdGhpcy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfX0gdHlwZT1cInRleHRcIi8+XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlLFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cclxuICAgICAgICAgICAgICAgIHtzZXR0aW5nLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIiA/IFxyXG4gICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmNsaXBib2FyZC5jb3B5KERhdGUubm93KCkrXCJcIilcclxuICAgICAgICAgICAgICAgIH19IGNvbG9yPVwiYnJhbmRcIj5Db3B5IGN1cnJlbnQgdGltZXN0YW1wPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj4gOiBudWxsfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IElucHV0Q2hvaWNlTW9kdWxlc1xyXG5jbGFzcyBJbnB1dENob2ljZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gPyBcImFzc2V0LVwiK3RoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdIDogXCJub25lXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLnVwZGF0ZVdoZW5GZXRjaGVkKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoZGF0YSl7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZGF0YS52YWx1ZVxyXG5cclxuICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIub25DaGFuZ2UodGhpcywgdmFsdWUgPT09IFwibm9uZVwiID8gbnVsbCA6IHZhbHVlLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgIHRoaXMuaXNUaW1pbmcgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEgPT09IFwibm9uZVwiID8gbnVsbCA6IHRoaXMuc3RhdGUuZGF0YS5yZXBsYWNlKFwiYXNzZXQtXCIsIFwiXCIpKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfSwgNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGE6IHZhbHVlXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gSW5wdXRDaG9pY2VNb2R1bGVzIHx8IChJbnB1dENob2ljZU1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBzZXR0aW5nID0gdGhpcy5wcm9wcy5zZXR0aW5nXHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIHJvd01vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUyLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZSxcclxuICAgICAgICAgICAgc2l6ZU1vZHVsZSxcclxuICAgICAgICAgICAgZmxleE1vZHVsZVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBcclxuICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5hc3NldHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgdmFsdWU6IFwiYXNzZXQtXCIrZS5pZCxcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBlLm5hbWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIG9wdGlvbnMudW5zaGlmdCh7XHJcbiAgICAgICAgICAgIHZhbHVlOiBcIm5vbmVcIixcclxuICAgICAgICAgICAgbGFiZWw6IFwiTm8gYXNzZXRzXCJcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtyb3dNb2R1bGUucm93K1wiIFwiK21hcmdpbk1vZHVsZS5tYXJnaW5Cb3R0b20yMH0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtgJHtyb3dNb2R1bGUuaXRlbX0gJHtmbGV4TW9kdWxlLmZsZXhDaGlsZH1gfT5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAge3NldHRpbmcudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkRyb3Bkb3duIHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9wdGlvbnM9e29wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IC8+XHJcbiAgICAgICAgICAgICAgICB7Lyo8U2VsZWN0IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyl9IG9wdGlvbnM9e29wdGlvbnN9Lz4qL31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBEaXZpZGVyTW9kdWxlcyA9IFtdXHJcbmNsYXNzIERpdmlkZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIERpdmlkZXJNb2R1bGVzJiZEaXZpZGVyTW9kdWxlc1swXSA/IERpdmlkZXJNb2R1bGVzIDogKERpdmlkZXJNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kaXZpZGVyICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXJEZWZhdWx0KVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZGl2aWRlcixcclxuICAgICAgICAgICAgZGl2aWRlckRlZmF1bHRcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXtgJHtkaXZpZGVyLmRpdmlkZXJ9ICR7ZGl2aWRlckRlZmF1bHQuZGl2aWRlckRlZmF1bHR9YH0+PC9kaXY+XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIERpc2NvcmRCdXR0b24gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHJvd01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnJlbW92ZUtleWJpbmQpWzBdXHJcbiAgICAgICAgbGV0IG1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30gY29sb3I9XCJicmFuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBScGNQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzID0ge30pe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogXCJwcm9maWxlXCJcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50YWJzID0gW11cclxuXHJcbiAgICAgICAgdGhpcy5wcm9wcy5zZXR0aW5ncy5wcmV2aWV3ID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZVRhYih0YWIpe1xyXG4gICAgICAgIGxldCBhbmNpZW50VGFiID0gdGhpcy5zdGF0ZS5hY3RpdmVcclxuICAgICAgICBpZihhbmNpZW50VGFiID09PSB0YWIucHJvcHMuaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIHRoaXMudGFicy5mb3JFYWNoKGUgPT4ge1xyXG4gICAgICAgICAgICBlLnNldEFjdGl2ZShmYWxzZSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRhYi5zZXRBY3RpdmUodHJ1ZSlcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiB0YWIucHJvcHMuaWRcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBwcmV2aWV3ID0gbmV3IHRoaXMucHJldmlldyh7XHJcbiAgICAgICAgICAgIHByZXZpZXc6IHRoaXNcclxuICAgICAgICB9KVxyXG4gICAgICAgIHByZXZpZXcuc2V0U3RhdGUodGhpcy5zdGF0ZS5ycGMpXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYldyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJuYXZcIiBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIkZ1bGwgUHJvZmlsZVwiIGlkPVwicHJvZmlsZVwiLz5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJVc2VyIFBvcG91dFwiIGlkPVwicG9wb3V0XCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAge3ByZXZpZXcucmVuZGVyKCl9XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfSAgIFxyXG5cclxuICAgIGlzQWN0aXZlKHRhYil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuYWN0aXZlID09PSB0YWJcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcHJldmlldygpe1xyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlID09PSBcInByb2ZpbGVcIilyZXR1cm4gUHJvZmlsZVxyXG4gICAgICAgIHJldHVybiBQb3BvdXRcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGFiIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBwcm9wcy5wcmV2aWV3LmlzQWN0aXZlKHByb3BzLmlkKVxyXG4gICAgICAgIH1cclxuICAgICAgICBwcm9wcy5wcmV2aWV3LnRhYnMucHVzaCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIHNldEFjdGl2ZShpc0FjdGl2ZSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogISFpc0FjdGl2ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGNsYXNzTmFtZSA9IGBsYy1uYXZJdGVtYFxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuYWN0aXZlKXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUFjdGl2ZWBcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2xhc3NOYW1lICs9IGAgbGMtbmF2SXRlbUluYWN0aXZlYFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9IG9uQ2xpY2s9eygpPT57XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMucHJldmlldy5jaGFuZ2VUYWIodGhpcylcclxuICAgICAgICB9fT5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgcG9wb3V0TW9kdWxlXHJcbmNsYXNzIFBvcG91dCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7IC8vIFRPRE86IFByb2JhYmx5IHVzZSBpbnRlcm5hbCBDb21wb25lbnRzIGluc3RlYWQgb2YgbWFraW5nIGl0IGZyb20gc2NyYXRjaC5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHBvcG91dE1vZHVsZSB8fCAocG9wb3V0TW9kdWxlID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyUG9wb3V0KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlVc2VyUG9wb3V0KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRoZW1lR2hvc3RIYWlybGluZUNoYW5uZWxzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubm90ZSAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wcm8gJiYgZS5pbmxpbmUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXMsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBwcm90aXBNb2R1bGUxLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxLFxyXG4gICAgICAgICAgICB1c2VyTW9kdWxlMVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBsZXQgdXNlciA9IHVzZXJNb2R1bGUxLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpXHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgdGltZXN0YW1wQ2xhc3MgPSB0aW1lc3RhbXBDbGFzcyB8fCBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXHJcblxyXG4gICAgICAgIGxldCBpbWFnZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZighZGF0YVtcImFzc2V0cy5sYXJnZVwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgaW1hZ2VzID0gW11cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5sYXJnZVwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2B9IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXR9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IDogXCJcIn1gfSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLnNtYWxsXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYH0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlVXNlclBvcG91dH0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIWltYWdlcy5sZW5ndGgpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHN9PlxyXG4gICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSkoKVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0IGxjLXRhYi1ib3gtc2hhZG93XCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLnVzZXJQb3BvdXR9IHJvbGU9XCJkaWFsb2dcIiB0YWJpbmRleD1cIi0xXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5oZWFkZXJQbGF5aW5nfT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlDZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25DZW50ZXJ9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLmhlYWRlclRvcH1gfSBzdHlsZT17e2ZsZXg6IFwiMSAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJXcmFwcGVyTm9ybWFsfSByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthdmF0YXJNb2R1bGUxfSByb2xlPVwiaW1nXCIgc3R5bGU9e3t3aWR0aDogXCI4MHB4XCIsIGhlaWdodDogXCI4MHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiOTJcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgOTIgODBcIiBjbGFzcz17YCR7YXZhdGFyTW9kdWxlMS5tYXNrfSAke2F2YXRhck1vZHVsZTEuc3ZnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yZWlnbk9iamVjdCB4PVwiMFwiIHk9XCIwXCIgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgbWFzaz1cInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC04MClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPXthdmF0YXJVUkx9IGFsdD1cIiBcIiBjbGFzcz17YXZhdGFyTW9kdWxlMS5hdmF0YXJ9IC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9yZWlnbk9iamVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXR1cyAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIGNsYXNzPXtyb290TW9kdWxlMS5hdmF0YXJIaW50fSB2aWV3Qm94PVwiMCAwIDgwIDgwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmVpZ25PYmplY3QgeD1cIjBcIiB5PVwiMFwiIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIG1hc2s9XCJ1cmwoI3N2Zy1tYXNrLWF2YXRhci1zdGF0dXMtcm91bmQtODApXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmF2YXRhckhpbnRJbm5lcn0+e01lc3NhZ2VzLlZJRVdfUFJPRklMRX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZvcmVpZ25PYmplY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlclRleHR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtzdHlsaW5nTW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5oZWFkZXJUYWdOb05pY2tuYW1lfSAke25hbWVUYWdNb2R1bGUxLm5hbWVUYWd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPXtgJHtuYW1lVGFnTW9kdWxlMS51c2VybmFtZX0gJHtyb290TW9kdWxlMS5oZWFkZXJUYWdVc2VybmFtZU5vTmlja25hbWV9YH0+e3VzZXIudXNlcm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4je3VzZXIuZGlzY3JpbWluYXRvcn08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5VXNlclBvcG91dH0gJHtyb290TW9kdWxlMS5hY3Rpdml0eX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuaGVhZGVyVGV4dE5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxMn1gfT57TWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9IRUFERVJfUExBWUlOR308L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuYm9keU5vcm1hbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17aW1hZ2VzID8gYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnRJbWFnZXNVc2VyUG9wb3V0IDogYWN0aXZpdHlNb2R1bGUxLmNvbnRlbnROb0ltYWdlc1VzZXJQb3BvdXR9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLm5hbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLm5hbWVOb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTR9YH0gdGl0bGU9e2RhdGEubmFtZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFjdGl2aXR5TmFtZX0+e2RhdGEubmFtZX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuZGV0YWlscylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiB0aXRsZT17ZGF0YS50aXRsZX0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5kZXRhaWxzfT57ZGF0YS5kZXRhaWxzfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLnN0YXRlKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IGNsYXNzPXthY3Rpdml0eU1vZHVsZTEuc3RhdGV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9e2RhdGEuc3RhdGV9PntkYXRhLnN0YXRlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkoKX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aW1lQ29tcG9uZW50ID0gdGltZXN0YW1wUmVuZGVyKFRpbWVzdGFtcCwgTWVzc2FnZXMpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1JlYWN0LmNyZWF0ZUVsZW1lbnQodGltZUNvbXBvbmVudCwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7cm9vdE1vZHVsZTEuYm9keX0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3RIYWlybGluZX0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcn0gJHtyb290TW9kdWxlMS5ib2R5SW5uZXJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmJvZHlUaXRsZX0+e01lc3NhZ2VzLk5PVEV9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake25vdGVNb2R1bGUxLm5vdGV9ICR7cm9vdE1vZHVsZTEubm90ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj17TWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUn0gbWF4bGVuZ3RoPVwiMjU2XCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBjbGFzcz17QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsYmFyR2hvc3RIYWlybGluZSlbMF0uc2Nyb2xsYmFyR2hvc3RIYWlybGluZX0gc3R5bGU9e3toZWlnaHQ6IFwiMzZweFwifX0gZGlzYWJsZWQ+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmZvb3Rlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEucHJvdGlwfSAke3Byb3RpcE1vZHVsZTEuaW5saW5lfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9e2Ake3Byb3RpcE1vZHVsZTEucHJvfSAke3RleHRNb2R1bGUxLmJhc2V9ICR7c2l6ZU1vZHVsZTEuc2l6ZTEyfWB9IHN0eWxlPXt7Y29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIn19PntNZXNzYWdlcy5QSU5ORURfTUVTU0FHRVNfUFJPX1RJUH08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtjb2xvck1vZHVsZTEuY29sb3JTdGFuZGFyZH0gJHtzaXplTW9kdWxlMS5zaXplMTR9ICR7cHJvdGlwTW9kdWxlMS50aXB9YH0+e01lc3NhZ2VzLkNPTlRFWFRfTUVOVV9ISU5UfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IFN0YXR1c01vZHVsZXNcclxuY2xhc3MgU3RhdHVzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1c01vZHVsZXMgfHwgKFN0YXR1c01vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFByZXNlbmNlKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZ2V0UHJlc2VuY2UsXHJcbiAgICAgICAgICAgIHBvaW50ZXJFdmVudHNcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgbGV0IHN0YXR1cyA9IGdldFByZXNlbmNlLmRlZmF1bHQuZ2V0UHJlc2VuY2UoKS5zdGF0dXNcclxuICAgICAgICBpZihzdGF0dXMgPT09IFwiaW52aXNpYmxlXCIpc3RhdHVzID0gXCJvZmZsaW5lXCJcclxuICAgICAgICByZXR1cm4gPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgeD1cIjYwXCIgeT1cIjYwXCIgZmlsbD1cIiNmZmZmZmZcIiBtYXNrPXtgdXJsKCNzdmctbWFzay1zdGF0dXMtJHtzdGF0dXN9KWB9IGNsYXNzTmFtZT17cG9pbnRlckV2ZW50c30+PC9yZWN0PlxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgdGltZXN0YW1wQ2xhc3MgPSBcIlwiXHJcblxyXG5sZXQgUHJvZmlsZU1vZHVsZXNcclxuY2xhc3MgUHJvZmlsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7IC8vIFRPRE86IFByb2JhYmx5IHVzZSBpbnRlcm5hbCBDb21wb25lbnRzIGluc3RlYWQgb2YgbWFraW5nIGl0IGZyb20gc2NyYXRjaC5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFByb2ZpbGVNb2R1bGVzIHx8IChQcm9maWxlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+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+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2lkOiBzZXR0aW5nLmlkLCBrZXk6IHNldHRpbmcuaWQsIGRhdGE6IHNldHRpbmcsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW3NldHRpbmcuaWRdLCBvbkNoYW5nZTogKGlkLCBjaGVja2VkKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UoaWQsIGNoZWNrZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH19KTtcclxuICAgICAgICAgICAgICAgIH0pXTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NUaXRsZSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcbi8vaDItMmdXRS1vIHRpdGxlLTNzWldZUSBzaXplMTYtMTRjR3o1IGhlaWdodDIwLW1PMmVJTiB3ZWlnaHRTZW1pQm9sZC1OSmV4emkgZGEtaDIgZGEtdGl0bGUgZGEtc2l6ZTE2IGRhLWhlaWdodDIwIGRhLXdlaWdodFNlbWlCb2xkIGRlZmF1bHRDb2xvci0xX2FqWDAgZGEtZGVmYXVsdENvbG9yIG1hcmdpblRvcDYwLTNQR2J0SyBkYS1tYXJnaW5Ub3A2MCBtYXJnaW5Cb3R0b20yMC0zMnFJRDcgZGEtbWFyZ2luQm90dG9tMjBcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN3aXRjaEl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuY2hlY2tlZCA9ICF0aGlzLnByb3BzLmNoZWNrZWQ7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLmlkLCB0aGlzLnByb3BzLmNoZWNrZWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgzIG1hcmdpbi1yZXNldCBtYXJnaW4tcmVzZXQgdWktZmxleC1jaGlsZFwifSwgdGV4dCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJIZWFkZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSwgdGhpcy5wcm9wcy50ZXh0LCB0aGlzLnByb3BzLmJ1dHRvbik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5wcm9wcy5zZWxlY3RlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGB1aS10YWItYmFyLWl0ZW0ke3RoaXMucHJvcHMuc2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2sodGhpcy5wcm9wcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJTZXBhcmF0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1zZXBhcmF0b3IgbWFyZ2luLXRvcC04IG1hcmdpbi1ib3R0b20tOFwifSk7XHJcbiAgICB9XHJcbn0iLCJcInVzZSBzdHJpY3RcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIlxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3RcclxuXHJcbmNvbnN0IGludGVydmFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkludGVydmFsKVswXVxyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKGNvbXBvbmVudCwgTWVzc2FnZXMpIHtcclxuICAgIGNsYXNzIFRpbWVSZW5kZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgICAgIHN1cGVyKHByb3BzKVxyXG4gICAgICAgICAgICB0aGlzLl9pbnRlcnZhbCA9IG5ldyBpbnRlcnZhbE1vZHVsZTEuSW50ZXJ2YWwoKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudERpZE1vdW50KCl7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RhcnQoMWUzLCAoZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zZXRTdGF0ZShzZWxmLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgICAgIH0pKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwuc3RvcCgpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnREaWRVcGRhdGUoYWN0aXZpdHkpe1xyXG4gICAgICAgICAgICBpZihhY3Rpdml0eS50aW1lc3RhbXBzLmVuZCA9PT0gdGhpcy5wcm9wcy50aW1lc3RhbXBzLmVuZCAmJiBhY3Rpdml0eS50aW1lc3RhbXBzLnN0YXJ0ID09PSB0aGlzLnByb3BzLnRpbWVzdGFtcHMuc3RhcnQpcmV0dXJuXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUodGhpcy5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0VXBkYXRlZFRpbWUoKXtcclxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB0aGlzLnByb3BzLnRpbWVzdGFtcHNcclxuICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCkgLyAxZTM7XHJcbiAgICAgICAgICAgIGlmKG51bGwgIT0gdGltZXN0YW1wcy5lbmQpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGlmZihub3csIGNoZWNrVW5peCh0aW1lc3RhbXBzLmVuZCkgLyAxZTMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYobnVsbCAhPSB0aW1lc3RhbXBzLnN0YXJ0KXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERpZmYoY2hlY2tVbml4KHRpbWVzdGFtcHMuc3RhcnQpIC8gMWUzLCBub3cpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiAwLFxyXG4gICAgICAgICAgICAgICAgbWludXRlczogMCxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IDBcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyVGltZShudW1iZXIsIHJlbW92ZVplcm8pe1xyXG4gICAgICAgICAgICBpZihyZW1vdmVaZXJvID09PSB1bmRlZmluZWQpcmVtb3ZlWmVybyA9IGZhbHNlXHJcbiAgICAgICAgICAgIGlmKHJlbW92ZVplcm8gJiYgbnVtYmVyIDw9IDApcmV0dXJuIC0xXHJcbiAgICAgICAgICAgIGlmKG51bWJlciA8IDEwKXJldHVybiBcIjBcIitudW1iZXJcclxuICAgICAgICAgICAgcmV0dXJuIG51bWJlclxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0RGlmZih0aW1lc3RhbXAsIG5vdyl7XHJcbiAgICAgICAgICAgIGxldCBob3VycyA9IE1hdGgubWF4KG5vdyAtIHRpbWVzdGFtcCwgMClcclxuICAgICAgICAgICAgbGV0IHNlY29uZHMgPSBNYXRoLmZsb29yKGhvdXJzKSAlIDYwXHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gTWF0aC5mbG9vcihob3VycyAvIDYwKSAlIDYwXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogTWF0aC5mbG9vcihob3VycyAvIDM2MDApICUgMjQsXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzLFxyXG4gICAgICAgICAgICAgICAgc2Vjb25kc1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgbGV0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgICAgICBsZXQgdGltZXN0YW1wcyA9IHByb3BzLnRpbWVzdGFtcHNcclxuXHJcbiAgICAgICAgICAgIGxldCB1c2VkUHJvcHMgPSBmdW5jdGlvbihwcm9wcywgaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChudWxsID09IHByb3BzKSByZXR1cm4ge307XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSB7fVxyXG4gICAgICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhwcm9wcyk7XHJcblxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0ga2V5c1tpXVxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtcy5pbmRleE9mKGtleSkgPj0gMCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcHNba2V5XSA9IHByb3BzW2tleV1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcHNcclxuICAgICAgICAgICAgfShwcm9wcywgW1widGltZXN0YW1wc1wiXSlcclxuXHJcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICAgICAgbGV0IGhvdXJzID0gc3RhdGUuaG91cnNcclxuICAgICAgICAgICAgbGV0IG1pbnV0ZXMgPSBzdGF0ZS5taW51dGVzXHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzID0gc3RhdGUuc2Vjb25kc1xyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IHtcclxuICAgICAgICAgICAgICAgIGhvdXJzOiB0aGlzLnJlbmRlclRpbWUoaG91cnMsICEwKSxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXM6IHRoaXMucmVuZGVyVGltZShtaW51dGVzKSxcclxuICAgICAgICAgICAgICAgIHNlY29uZHM6IHRoaXMucmVuZGVyVGltZShzZWNvbmRzKVxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBpZih0aW1lc3RhbXBzLmVuZCAhPT0gbnVsbCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChjb21wb25lbnQsIE9iamVjdC5hc3NpZ24oe30sIHVzZWRQcm9wcywge1xyXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2VzLlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX0VORC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRpbWVzdGFtcHMuc3RhcnQgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB1c2VkUHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9TVEFSVC5mb3JtYXQoZGF0YSlcclxuICAgICAgICAgICAgICAgIH0pKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFRpbWVSZW5kZXJcclxufTtcclxuXHJcbmZ1bmN0aW9uIGNoZWNrVW5peChlKSB7XHJcbiAgICByZXR1cm4gKFwiXCIgKyBlKS5sZW5ndGggPCAxMyA/IDFlMyAqIGUgOiBlXHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Rvb2xzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB0b29sc01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvb2xzQ29udGFpbmVyKVswXVxyXG4gICAgICAgIGxldCBjb250YWluZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250YWluZXIgJiYgZS5jbG9zZUJ1dHRvbiAmJiBlLmNsb3NlQnV0dG9uQm9sZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMtY29udGFpbmVyIFwiK3Rvb2xzTW9kdWxlLnRvb2xzQ29udGFpbmVyfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMgXCIrdG9vbHNNb2R1bGUudG9vbHN9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNvbnRhaW5lck1vZHVsZS5jb250YWluZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0bi1jbG9zZSBcIitjb250YWluZXJNb2R1bGUuY2xvc2VCdXR0b24sIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImVzYy10ZXh0IFwiK2NvbnRhaW5lck1vZHVsZS5rZXliaW5kfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFU0NcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2xvc2VCdXR0b24gJiYgZS5rZXliaW5kQm9sZClbMF0uY2xvc2VCdXR0b24uc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoY2xvc2VCdXR0b24pIGNsb3NlQnV0dG9uLmNsaWNrKCk7XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogVG9vbHRpcCB0aGF0IGF1dG9tYXRpY2FsbHkgc2hvdyBhbmQgaGlkZSB0aGVtc2VsdmVzIG9uIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG4gKiBXaWxsIGFsc28gcmVtb3ZlIHRoZW1zZWx2ZXMgaWYgdGhlIG5vZGUgdG8gd2F0Y2ggaXMgcmVtb3ZlZCBmcm9tIERPTSB0aHJvdWdoXHJcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cclxuICpcclxuICogTm90ZSB0aGlzIGlzIG5vdCB1c2luZyBEaXNjb3JkJ3MgaW50ZXJuYWxzIGJ1dCBub3JtYWwgRE9NIG1hbmlwdWxhdGlvbiBhbmQgZW11bGF0ZXNcclxuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIEVtdWxhdGVkVG9vbHRpcFxyXG4gKiBAdmVyc2lvbiAwLjAuMVxyXG4gKi9cclxuXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxuXHJcbi8vPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZYyBkaXNhYmxlZFBvaW50ZXJFdmVudHMtMXB0Z1RCXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDIzN3B4OyBib3R0b206IDUxcHg7XCI+XHJcbi8vXHQ8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgdG9vbHRpcFRvcC1YRERTeHggdG9vbHRpcEJsYWNrLVBQRzQ3eiB0b29sdGlwRGlzYWJsZVBvaW50ZXJFdmVudHMtM2VhQkdOXCIgc3R5bGU9XCJvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IG5vbmU7XCI+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcktcIj48L2Rpdj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBDb250ZW50LWJxVkxXS1wiPlVzZXIgU2V0dGluZ3M8L2Rpdj5cclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5cclxuLy88ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljXCIgc3R5bGU9XCJ0b3A6IDg2MHB4OyBsZWZ0OiA2MzIuNXB4O1wiPlxyXG4vL1x0PGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIHRvb2x0aXBCbGFjay1QUEc0N3ogdG9vbHRpcFRvcC1YRERTeHhcIj5cclxuLy9cdFx0PGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlyS1wiPjwvZGl2PlxyXG4vL1x0XHRDaGFuZ2Vsb2dcclxuLy9cdDwvZGl2PlxyXG4vLzwvZGl2PlxyXG5sZXQgVG9vbHRpcENsYXNzZXNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcENsYXNzZXMoKXtcclxuXHRpZihUb29sdGlwQ2xhc3NlcylyZXR1cm4gVG9vbHRpcENsYXNzZXNcclxuXHRyZXR1cm4gVG9vbHRpcENsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInRvb2x0aXBcIiwgXCJ0b29sdGlwQmxhY2tcIik7XHJcbn1cclxubGV0IFRvb2x0aXBMYXllcnNcclxuZnVuY3Rpb24gZ2V0VG9vbHRpcExheWVycygpe1xyXG5cdGlmKFRvb2x0aXBMYXllcnMpcmV0dXJuIFRvb2x0aXBMYXllcnNcclxuXHRyZXR1cm4gVG9vbHRpcExheWVycyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwibGF5ZXJcIiwgXCJsYXllckNvbnRhaW5lclwiKTtcclxufVxyXG5cclxuY29uc3QgZ2V0Q2xhc3MgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgY29uc3QgdXBwZXJDYXNlID0gc2lkZU9yQ29sb3JbMF0udG9VcHBlckNhc2UoKSArIHNpZGVPckNvbG9yLnNsaWNlKDEpO1xyXG4gICAgY29uc3QgdG9vbHRpcENsYXNzID0gZ2V0VG9vbHRpcENsYXNzZXMoKVtgdG9vbHRpcCR7dXBwZXJDYXNlfWBdO1xyXG4gICAgaWYgKHRvb2x0aXBDbGFzcykgcmV0dXJuIHRvb2x0aXBDbGFzcztcclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuY29uc3QgY2xhc3NFeGlzdHMgPSBmdW5jdGlvbihzaWRlT3JDb2xvcikge1xyXG4gICAgcmV0dXJuIGdldENsYXNzKHNpZGVPckNvbG9yKSA/IHRydWUgOiBmYWxzZTtcclxufTtcclxuXHJcbmNvbnN0IHRvUHggPSBmdW5jdGlvbih2YWx1ZSkge1xyXG4gICAgcmV0dXJuIGAke3ZhbHVlfXB4YDtcclxufTtcclxuXHJcbi8qIDxkaXYgY2xhc3M9XCJsYXllci12OUh5WWMgZGEtbGF5ZXJcIiBzdHlsZT1cImxlZnQ6IDIzNC41cHg7IGJvdHRvbTogNTFweDtcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyBkYS10b29sdGlwIHRvb2x0aXBUb3AtWEREU3h4IHRvb2x0aXBCbGFjay1QUEc0N3pcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLIGRhLXRvb2x0aXBQb2ludGVyXCI+PC9kaXY+XHJcbiAgICAgICAgVXNlciBTZXR0aW5nc1xyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiAqL1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRW11bGF0ZWRUb29sdGlwIHtcclxuXHQvKipcclxuXHQgKlxyXG5cdCAqIEBjb25zdHJ1Y3RvclxyXG5cdCAqIEBwYXJhbSB7KEhUTUxFbGVtZW50fGpRdWVyeSl9IG5vZGUgLSBET00gbm9kZSB0byBtb25pdG9yIGFuZCBzaG93IHRoZSB0b29sdGlwIG9uXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHRpcCAtIHN0cmluZyB0byBzaG93IGluIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0b29sdGlwXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnN0eWxlPWJsYWNrXSAtIGNvcnJlbGF0ZXMgdG8gdGhlIGRpc2NvcmQgc3R5bGluZy9jb2xvcnMgKGJsYWNrLCBicmFuZCwgZ3JlZW4sIGdyZXksIHJlZCwgeWVsbG93KVxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zaWRlPXRvcF0gLSBjYW4gYmUgYW55IG9mIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdFxyXG5cdCAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMucHJldmVudEZsaXA9ZmFsc2VdIC0gcHJldmVudHMgbW92aW5nIHRoZSB0b29sdGlwIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGlmIGl0IGlzIHRvbyBiaWcgb3IgZ29lcyBvZmZzY3JlZW5cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGlzYWJsZWQ9ZmFsc2VdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgYmUgZGlzYWJsZWQgZnJvbSBzaG93aW5nIG9uIGhvdmVyXHJcblx0ICovXHJcblx0Y29uc3RydWN0b3Iobm9kZSwgdGV4dCwgb3B0aW9ucyA9IHt9KSB7XHJcblx0XHRjb25zdCB7c3R5bGUgPSBcImJsYWNrXCIsIHNpZGUgPSBcInRvcFwiLCBwcmV2ZW50RmxpcCA9IGZhbHNlLCBkaXNhYmxlZCA9IGZhbHNlfSA9IG9wdGlvbnM7XHJcblx0XHR0aGlzLm5vZGUgPSBub2RlIGluc3RhbmNlb2YgalF1ZXJ5ID8gbm9kZVswXSA6IG5vZGU7XHJcbiAgICAgICAgdGhpcy5sYWJlbCA9IHRleHQ7XHJcbiAgICAgICAgdGhpcy5zdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7XHJcblx0XHR0aGlzLnNpZGUgPSBzaWRlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgdGhpcy5wcmV2ZW50RmxpcCA9IHByZXZlbnRGbGlwO1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuXHJcbiAgICAgICAgaWYgKCFjbGFzc0V4aXN0cyh0aGlzLnNpZGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTaWRlICR7dGhpcy5zaWRlfSBkb2VzIG5vdCBleGlzdC5gKTtcclxuXHRcdGlmICghY2xhc3NFeGlzdHModGhpcy5zdHlsZSkpIHJldHVybiBVdGlscy5lcnIoXCJFbXVsYXRlZFRvb2x0aXBcIiwgYFN0eWxlICR7dGhpcy5zdHlsZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRcclxuXHRcdHRoaXMuZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcExheWVycygpLmxheWVyICsgXCIgXCIgKyBnZXRUb29sdGlwTGF5ZXJzKCkuZGlzYWJsZWRQb2ludGVyRXZlbnRzO1xyXG5cclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XHJcblx0XHR0aGlzLmxhYmVsRWxlbWVudC5jbGFzc05hbWUgPSBnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXBDb250ZW50XHJcblxyXG5cdFx0Y29uc3QgcG9pbnRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0cG9pbnRlckVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwUG9pbnRlcjtcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZChwb2ludGVyRWxlbWVudCk7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmFwcGVuZCh0aGlzLmxhYmVsRWxlbWVudCk7XHJcblx0XHR0aGlzLmVsZW1lbnQuYXBwZW5kKHRoaXMudG9vbHRpcEVsZW1lbnQpO1xyXG5cclxuXHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xyXG5cclxuXHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdFx0bXV0YXRpb25zLmZvckVhY2goKG11dGF0aW9uKSA9PiB7XHJcblx0XHRcdFx0XHRjb25zdCBub2RlcyA9IEFycmF5LmZyb20obXV0YXRpb24ucmVtb3ZlZE5vZGVzKTtcclxuXHRcdFx0XHRcdGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZih0aGlzLm5vZGUpID4gLTE7XHJcblx0XHRcdFx0XHRjb25zdCBwYXJlbnRNYXRjaCA9IG5vZGVzLnNvbWUocGFyZW50ID0+IHBhcmVudC5jb250YWlucyh0aGlzLm5vZGUpKTtcclxuXHRcdFx0XHRcdGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG5cdFx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0XHRcdFx0b2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0pO1xyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuXHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHR9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29udGFpbmVyIHdoZXJlIHRoZSB0b29sdGlwIHdpbGwgYmUgYXBwZW5kZWQuICovXHJcbiAgICBnZXQgY29udGFpbmVyKCkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb3BvdXRzKVswXS5wb3BvdXRzLnNwbGl0KFwiIFwiKVswXStcIiB+IC5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllckNvbnRhaW5lcilbMF0ubGF5ZXJDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdKTsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dBYm92ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYmVsb3cgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSBsZWZ0IG9mIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0xlZnQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xyXG5cdGdldCBjYW5TaG93UmlnaHQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA8PSBVdGlscy5zY3JlZW5XaWR0aDsgfVxyXG5cclxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cclxuXHRoaWRlKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcclxuXHR9XHJcblxyXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXHJcblx0c2hvdygpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kKHRoaXMuZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dBYm92ZSB8fCAoIXRoaXMuY2FuU2hvd0Fib3ZlICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImJvdHRvbVwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImxlZnRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93TGVmdCB8fCAoIXRoaXMuY2FuU2hvd0xlZnQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dSaWdodCB8fCAoIXRoaXMuY2FuU2hvd1JpZ2h0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXHJcblx0c2hvd0Fib3ZlKCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwidG9wXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGJlbG93IHRoZSBub2RlLiAqL1xyXG5cdHNob3dCZWxvdygpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgbGVmdCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93TGVmdCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImxlZnRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd1JpZ2h0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwicmlnaHRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVySG9yaXpvbnRhbGx5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICh0aGlzLm5vZGUub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVyVmVydGljYWxseSgpIHtcclxuXHRcdGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgLyAyKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAvIDIpKSk7XHJcblx0fVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IHtzdHlsZSA9IFwiYmxhY2tcIiwgc2lkZSA9IFwidG9wXCIsIHRleHQgPSBcIlwifSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5ub2RlID0gQkRWMi5yZWFjdERvbS5maW5kRE9NTm9kZSh0aGlzKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBuZXcgVG9vbHRpcCh0aGlzLm5vZGUsIHRleHQsIHtzdHlsZSwgc2lkZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMudG9vbHRpcC5oaWRlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMudG9vbHRpcDtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1hTdmcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInN2Z1wiLFxyXG4gICAgICAgICAgICB7eG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiwgdmlld0JveDogXCIwIDAgMTIgMTJcIiwgc3R5bGU6IHt3aWR0aDogXCIxOHB4XCIsIGhlaWdodDogXCIxOHB4XCJ9fSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJnXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJhY2tncm91bmRcIiwgZmlsbDogXCJub25lXCIsIGZpbGxSdWxlOiBcImV2ZW5vZGRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtkOiBcIk0wIDBoMTJ2MTJIMFwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtjbGFzc05hbWU6IFwiZmlsbFwiLCBmaWxsOiBcIiNkY2RkZGVcIiwgZDogXCJNOS41IDMuMjA1TDguNzk1IDIuNSA2IDUuMjk1IDMuMjA1IDIuNWwtLjcwNS43MDVMNS4yOTUgNiAyLjUgOC43OTVsLjcwNS43MDVMNiA2LjcwNSA4Ljc5NSA5LjVsLjcwNS0uNzA1TDYuNzA1IDZcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiY3J5cHRvXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImVsZWN0cm9uXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImV2ZW50c1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJmc1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJta2RpcnBcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibW9kdWxlXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm5vZGUtZmV0Y2hcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicGF0aFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyZXF1ZXN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJpbXJhZlwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ5YXV6bFwiKTsiXSwic291cmNlUm9vdCI6IiJ9