mirror of
https://github.com/Lightcord/Lightcord.git
synced 2025-04-12 00:55:40 +02:00
11737 lines
1.4 MiB
11737 lines
1.4 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).",
|
|
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 Internal Developer Options. This allow the \"Experiments\" tab and the \"Developer Options\" tab. (must reopen settings)",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Ad Block": {
|
|
id: "lightcord-4",
|
|
info: "Block any BOT that dm you with an invite link. Even in an embed.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Enable Lightcord Servers": {
|
|
id: "lightcord-5",
|
|
info: "Enable Lightcord's servers. Disabling this will disable custom badges.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Disable typing": {
|
|
id: "lightcord-7",
|
|
info: "Don't let other see you're typing.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
|
|
/** Lightcord Window */
|
|
"Always-on-Top": {
|
|
id: "lightcord-3",
|
|
info: "Enable window's Always-on-Top mode, where Lightcord stays on top of other applications.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Window"
|
|
},
|
|
|
|
/** RichPresence */
|
|
"Enable": {
|
|
id: "lightcord-presence-1",
|
|
info: "Enable RichPresence below.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "status"
|
|
}
|
|
};
|
|
const defaultCookie = {
|
|
"bda-gs-1": true,
|
|
"bda-gs-2": false,
|
|
"bda-gs-3": false,
|
|
"bda-gs-4": false,
|
|
"bda-gs-5": true,
|
|
"bda-gs-6": false,
|
|
"bda-gs-7": false,
|
|
"bda-gs-8": true,
|
|
"bda-es-0": true,
|
|
"bda-es-1": true,
|
|
"bda-es-2": true,
|
|
"bda-es-4": false,
|
|
"bda-es-6": true,
|
|
"bda-es-7": true,
|
|
"bda-gs-b": false,
|
|
"bda-es-8": true,
|
|
"bda-dc-0": false,
|
|
"bda-css-0": false,
|
|
"bda-css-1": false,
|
|
"bda-es-9": true,
|
|
"fork-dm-1": false,
|
|
"fork-ps-1": true,
|
|
"fork-ps-2": true,
|
|
"fork-ps-3": true,
|
|
"fork-ps-4": true,
|
|
"fork-ps-5": true,
|
|
"fork-ps-6": true,
|
|
"fork-es-2": false,
|
|
"fork-es-3": true,
|
|
"fork-wp-1": false,
|
|
"fork-wp-2": false,
|
|
"fork-beta": true,
|
|
"reactDevTools": false,
|
|
"lightcord-1": false,
|
|
"lightcord-2": true,
|
|
"lightcord-presence-1": false,
|
|
"lightcord-3": false,
|
|
"lightcord-4": false,
|
|
"lightcord-5": true,
|
|
"lightcord-6": true,
|
|
"lightcord-7": false
|
|
};
|
|
const settingsCookie = {};
|
|
const settingsRPC = {};
|
|
const defaultRPC = {
|
|
"name": "Lightcord",
|
|
"application_id": "711416957718757418",
|
|
"state": "Lightcord Client",
|
|
"details": "Browsing Discord",
|
|
"timestamps.start": Date.now(),
|
|
"assets.small": null,
|
|
"assets.large": "712323821037682791"
|
|
};
|
|
const bdpluginErrors = [];
|
|
const bdthemeErrors = []; // define for backwards compatibility
|
|
|
|
const bdConfig = Object.create(BetterDiscordConfig);
|
|
const bdthemes = {};
|
|
const bdplugins = {};
|
|
const pluginCookie = {};
|
|
const themeCookie = {};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/index.js":
|
|
/*!**********************!*\
|
|
!*** ./src/index.js ***!
|
|
\**********************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CoreWrapper; });
|
|
/* harmony import */ var _localStorageFix__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./localStorageFix */ "./src/localStorageFix.js");
|
|
/* harmony import */ var _loadingIcon__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./loadingIcon */ "./src/loadingIcon.js");
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modules/bdApi */ "./src/modules/bdApi.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./modules/pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./modules/themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./modules/utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./modules/bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./modules/settingsPanel */ "./src/modules/settingsPanel.js");
|
|
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./modules/dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./modules/contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./modules/classNormalizer */ "./src/modules/classNormalizer.js");
|
|
/* harmony import */ var _modules_core__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./modules/core */ "./src/modules/core.js");
|
|
|
|
|
|
Object(_localStorageFix__WEBPACK_IMPORTED_MODULE_0__["default"])();
|
|
Object(_loadingIcon__WEBPACK_IMPORTED_MODULE_1__["default"])();
|
|
|
|
const deprecateGlobal = (key, value) => {
|
|
// value = typeof(value) !== "object" ? value : new Proxy(value, {
|
|
// get: function(obj, mod) {
|
|
// if (!obj.hasOwnProperty(mod)) return undefined;
|
|
// return obj[mod];
|
|
// },
|
|
// set: function(obj, mod) {
|
|
// if (obj.hasOwnProperty(mod)) return Utils.err("Deprecated Global", "Trying to overwrite deprecated BD globals");
|
|
// }
|
|
// });
|
|
Object.defineProperty(window, key, {
|
|
get() {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"].warn("Deprecated Global", `"${key}" will be removed in future versions. Please only use BdApi.`);
|
|
return value;
|
|
}
|
|
|
|
});
|
|
};
|
|
|
|
|
|
const globalKeys = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_2__);
|
|
|
|
for (const key of globalKeys) deprecateGlobal(key, _0globals__WEBPACK_IMPORTED_MODULE_2__[key]);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deprecateGlobal("BDV2", _modules_v2__WEBPACK_IMPORTED_MODULE_4__["default"]);
|
|
deprecateGlobal("pluginModule", _modules_pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
deprecateGlobal("themeModule", _modules_themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
deprecateGlobal("Utils", _modules_utils__WEBPACK_IMPORTED_MODULE_7__["default"]);
|
|
deprecateGlobal("BDEvents", _modules_bdEvents__WEBPACK_IMPORTED_MODULE_8__["default"]);
|
|
deprecateGlobal("settingsPanel", _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_9__["default"]);
|
|
deprecateGlobal("DataStore", _modules_dataStore__WEBPACK_IMPORTED_MODULE_10__["default"]);
|
|
deprecateGlobal("ContentManager", _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"]);
|
|
deprecateGlobal("ClassNormalizer", _modules_classNormalizer__WEBPACK_IMPORTED_MODULE_12__["default"]);
|
|
window.BdApi = _modules_bdApi__WEBPACK_IMPORTED_MODULE_3__["default"];
|
|
|
|
deprecateGlobal("mainCore", _modules_core__WEBPACK_IMPORTED_MODULE_13__["default"]);
|
|
class CoreWrapper {
|
|
constructor(bdConfig) {
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
|
|
}
|
|
|
|
init() {
|
|
// deprecateGlobal("mainCore", this.mainCore);
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
|
|
}
|
|
|
|
} // function patchModuleLoad() {
|
|
// const namespace = "betterdiscord";
|
|
// const prefix = `${namespace}/`;
|
|
// const Module = require("module");
|
|
// const load = Module._load;
|
|
// // const resolveFilename = Module._resolveFilename;
|
|
// Module._load = function(request) {
|
|
// if (request === namespace || request.startsWith(prefix)) {
|
|
// const requested = request.substr(prefix.length);
|
|
// if (requested == "api") return BdApi;
|
|
// }
|
|
// return load.apply(this, arguments);
|
|
// };
|
|
// // Module._resolveFilename = function (request, parent, isMain) {
|
|
// // if (request === "betterdiscord" || request.startsWith("betterdiscord/")) {
|
|
// // const contentPath = PluginManager.getPluginPathByModule(parent);
|
|
// // if (contentPath) return request;
|
|
// // }
|
|
// // return resolveFilename.apply(this, arguments);
|
|
// // };
|
|
// return function() {
|
|
// Module._load = load;
|
|
// };
|
|
// }
|
|
// patchModuleLoad();
|
|
// var settingsPanel, voiceMode,, dMode, publicServersModule;
|
|
// var bdConfig = null;
|
|
|
|
__webpack_require__(/*! request */ "request"); // just in cache so plugin can require it too
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/loadingIcon.js":
|
|
/*!****************************!*\
|
|
!*** ./src/loadingIcon.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony default export */ __webpack_exports__["default"] = (() => {
|
|
const v2Loader = document.createElement("div");
|
|
v2Loader.className = "bd-loaderv2";
|
|
v2Loader.title = "BandagedBD is loading...";
|
|
document.body.appendChild(v2Loader);
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/localStorageFix.js":
|
|
/*!********************************!*\
|
|
!*** ./src/localStorageFix.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony default export */ __webpack_exports__["default"] = (function () {
|
|
const contentWindowGetter = Object.getOwnPropertyDescriptor(HTMLIFrameElement.prototype, "contentWindow").get;
|
|
Object.defineProperty(HTMLIFrameElement.prototype, "contentWindow", {
|
|
get: function () {
|
|
const contentWindow = Reflect.apply(contentWindowGetter, this, arguments);
|
|
return new Proxy(contentWindow, {
|
|
getOwnPropertyDescriptor: function (obj, prop) {
|
|
if (prop === "localStorage") return undefined;
|
|
return Object.getOwnPropertyDescriptor(obj, prop);
|
|
},
|
|
get: function (obj, prop) {
|
|
if (prop === "localStorage") return null;
|
|
const val = obj[prop];
|
|
if (typeof val === "function") return val.bind(obj);
|
|
return val;
|
|
}
|
|
});
|
|
}
|
|
}); // Prevent interception by patching Reflect.apply and Function.prototype.bind
|
|
|
|
Object.defineProperty(Reflect, "apply", {
|
|
value: Reflect.apply,
|
|
writable: false,
|
|
configurable: false
|
|
});
|
|
Object.defineProperty(Function.prototype, "bind", {
|
|
value: Function.prototype.bind,
|
|
writable: false,
|
|
configurable: false
|
|
});
|
|
const oOpen = XMLHttpRequest.prototype.open;
|
|
|
|
XMLHttpRequest.prototype.open = function () {
|
|
const url = arguments[1];
|
|
if (url.toLowerCase().includes("api/webhooks")) return null;
|
|
return Reflect.apply(oOpen, this, arguments);
|
|
};
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/24hour.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/modules/24hour.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class TFHour {
|
|
inject24Hour() {
|
|
if (this.cancel24Hour) return;
|
|
const twelveHour = new RegExp(`([0-9]{1,2}):([0-9]{1,2})\\s(AM|PM)`);
|
|
|
|
const convert = data => {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) return;
|
|
const matched = data.returnValue.match(twelveHour);
|
|
if (!matched || matched.length !== 4) return;
|
|
if (matched[3] === "AM") return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "00" : matched[1].padStart(2, "0")}:${matched[2]}`);
|
|
return data.returnValue = data.returnValue.replace(matched[0], `${matched[1] === "12" ? "12" : parseInt(matched[1]) + 12}:${matched[2]}`);
|
|
};
|
|
|
|
const cancelCozy = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "calendarFormat", {
|
|
after: convert
|
|
}); // Called in Cozy mode
|
|
|
|
const cancelCompact = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].TimeFormatter, "dateFormat", {
|
|
after: convert
|
|
}); // Called in Compact mode
|
|
|
|
this.cancel24Hour = () => {
|
|
cancelCozy();
|
|
cancelCompact();
|
|
}; // Cancel both
|
|
|
|
}
|
|
|
|
remove24Hour() {
|
|
if (this.cancel24Hour) this.cancel24Hour();
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/AntiAdDM.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/modules/AntiAdDM.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
const dispatcher = window.Lightcord.DiscordModules.dispatcher;
|
|
const ChannelModule = BDModules.get(e => e.default && e.default.getChannel && e.default.hasChannel)[0].default;
|
|
let relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
|
|
let DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
|
|
const blocked = {};
|
|
let userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0];
|
|
|
|
function getCurrentUser() {
|
|
if (userModule) return userModule.default.getCurrentUser();
|
|
return null;
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class AntiBotDM {
|
|
constructor() {
|
|
this.antiDM = this.antiDM.bind(this);
|
|
this.enabled = false;
|
|
}
|
|
|
|
enable() {
|
|
if (this.enabled) return;
|
|
this.enabled = true;
|
|
dispatcher.subscribe("MESSAGE_CREATE", this.antiDM);
|
|
}
|
|
|
|
disable() {
|
|
if (!this.enabled) return;
|
|
this.enabled = false;
|
|
dispatcher.unsubscribe("MESSAGE_CREATE", this.antiDM);
|
|
}
|
|
|
|
antiDM(ev) {
|
|
if (!ev.message.author.bot) return;
|
|
if (ev.message.author.id === getCurrentUser().id) if (ev.message.guild_id) return;
|
|
const channel = ChannelModule.getChannel(ev.message.channel_id);
|
|
if (!channel) return; // might be broken
|
|
|
|
if (channel.type !== 1) return;
|
|
if (blocked[ev.message.author.id]) return; // If the user unblock the bot, Don't block it again.
|
|
|
|
if (scanMessage(ev.message)) {
|
|
blocked[ev.message.author.id] = true;
|
|
_utils__WEBPACK_IMPORTED_MODULE_0__["default"].showToast(`[AdBlock]: Blocked ${ev.message.author.username}#${ev.message.author.discriminator}`, {
|
|
"type": "warning"
|
|
});
|
|
if (!relationShipModule) relationShipModule = BDModules.get(e => e.default && e.default.addRelationship)[0];
|
|
relationShipModule.default.addRelationship(ev.message.author.id, {
|
|
location: "ContextMenu"
|
|
}, 2);
|
|
if (!DMModule) DMModule = BDModules.get(e => e.default && e.default.closePrivateChannel)[0];
|
|
DMModule.default.closePrivateChannel(channel.id, false);
|
|
}
|
|
}
|
|
|
|
}());
|
|
|
|
function scanMessage(message) {
|
|
if (/(discord\.gg|discord\.com\/invite\/|discordapp\.com\/invite\/)/g.test(message.content)) return true;
|
|
if (EmbedsContains(message, "discord.gg/") || EmbedsContains(message, "discord.com/invite/") || EmbedsContains(message, "discordapp.com/invite/")) return true;
|
|
return false;
|
|
}
|
|
|
|
function EmbedsContains(message, search) {
|
|
let embeds = message.embeds;
|
|
if (embeds.length === 0) return false;
|
|
return embeds.map(embed => {
|
|
if (embed.type !== "rich") return false;
|
|
if ((embed.title || "").includes(search)) return true;
|
|
if ((embed.description || "").includes(search)) return true;
|
|
if (((embed.footer || "") && embed.footer.text || "").includes(search)) return true;
|
|
if (embed.fields.map(e => {
|
|
return e.value.includes(search) || e.name.includes(search);
|
|
}).includes(true)) return true;
|
|
return false;
|
|
}).includes(true);
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/CustomRichPresence.js":
|
|
/*!*******************************************!*\
|
|
!*** ./src/modules/CustomRichPresence.js ***!
|
|
\*******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
|
|
const dispatcher = BDModules.get(m => m.Dispatcher && m.default && m.default.dispatch)[0].default;
|
|
const ActionTypes = BDModules.get(m => m.ActionTypes)[0].ActionTypes;
|
|
const socketId = "lightcord-spoof-socket";
|
|
const pid = process.pid;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class CustomRichPresence {
|
|
constructor() {
|
|
this.enabled = false;
|
|
this.game = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"];
|
|
}
|
|
|
|
get formatedGame() {
|
|
if (!this.game) return null;
|
|
if (this.enabled === false) return null;
|
|
let game = {
|
|
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].name,
|
|
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"].application_id,
|
|
details: this.game.details || undefined,
|
|
state: this.game.state || undefined,
|
|
timestamps: this.game["timestamps.start"] ? {
|
|
start: this.game["timestamps.start"]
|
|
} : undefined,
|
|
assets: this.game["assets.large"] ? {
|
|
large_image: this.game["assets.large"],
|
|
small_image: this.game["assets.small"] || undefined
|
|
} : undefined
|
|
};
|
|
return game;
|
|
}
|
|
|
|
sendGame() {
|
|
dispatcher.dispatch({
|
|
type: ActionTypes.LOCAL_ACTIVITY_UPDATE,
|
|
socketId,
|
|
pid,
|
|
activity: this.formatedGame
|
|
});
|
|
}
|
|
|
|
enable() {
|
|
if (this.enabled) return;
|
|
this.enabled = true;
|
|
console.log("Enabling custom RichPresence");
|
|
this.set(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"] || Object.create(_0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]));
|
|
this.sendGame();
|
|
}
|
|
|
|
disable() {
|
|
if (!this.enabled) return;
|
|
this.enabled = false;
|
|
console.log("Disabling custom RichPresence");
|
|
this.sendGame();
|
|
}
|
|
|
|
async fetchAssets(applicationId) {
|
|
let assets = await BDModules.get(e => e.getAssets)[0].getAssets(applicationId);
|
|
|
|
if (assets.undefined && typeof assets.undefined === "number") {
|
|
throw new Error("Unknown Application");
|
|
}
|
|
|
|
return assets;
|
|
}
|
|
|
|
set(activity) {
|
|
this.game = activity;
|
|
this.sendGame();
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/bdApi.js":
|
|
/*!******************************!*\
|
|
!*** ./src/modules/bdApi.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const BdApi = {
|
|
get React() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].React;
|
|
},
|
|
|
|
get ReactDOM() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactDom;
|
|
},
|
|
|
|
get ReactComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].ReactComponent;
|
|
},
|
|
|
|
get WindowConfigFile() {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].WindowConfigFile;
|
|
},
|
|
|
|
get settings() {
|
|
return _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"];
|
|
},
|
|
|
|
get emotes() {
|
|
return {};
|
|
},
|
|
|
|
// deprecated, deleted all emotes from betterdiscord.
|
|
get screenWidth() {
|
|
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
|
|
},
|
|
|
|
get screenHeight() {
|
|
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
|
|
}
|
|
|
|
};
|
|
|
|
BdApi.getAllWindowPreferences = function () {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences();
|
|
};
|
|
|
|
BdApi.getWindowPreference = function (key) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key);
|
|
};
|
|
|
|
BdApi.setWindowPreference = function (key, value) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value);
|
|
}; //Inject CSS to document head
|
|
//id = id of element
|
|
//css = custom css
|
|
|
|
|
|
BdApi.injectCSS = function (id, css) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css);
|
|
}; //Clear css/remove any element
|
|
//id = id of element
|
|
|
|
|
|
BdApi.clearCSS = function (id) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
|
|
}; //Inject CSS to document head
|
|
//id = id of element
|
|
//css = custom css
|
|
|
|
|
|
BdApi.linkJS = function (id, url) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url);
|
|
}; //Clear css/remove any element
|
|
//id = id of element
|
|
|
|
|
|
BdApi.unlinkJS = function (id) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
|
|
}; //Get another plugin
|
|
//name = name of plugin
|
|
|
|
|
|
BdApi.getPlugin = function (name) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) {
|
|
return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin;
|
|
}
|
|
|
|
return null;
|
|
}; //Get BetterDiscord Core
|
|
|
|
|
|
BdApi.getCore = function () {
|
|
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`);
|
|
return _core__WEBPACK_IMPORTED_MODULE_1__["default"];
|
|
};
|
|
/**
|
|
* Shows a generic but very customizable modal.
|
|
* @param {string} title - title of the modal
|
|
* @param {string} content - a string of text to display in the modal
|
|
*/
|
|
|
|
|
|
BdApi.alert = function (title, content) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, {
|
|
cancelText: null
|
|
});
|
|
};
|
|
/**
|
|
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
|
|
* @param {string} title - title of the modal
|
|
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
|
|
* @param {object} [options] - options to modify the modal
|
|
* @param {boolean} [options.danger=false] - whether the main button should be red or not
|
|
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
|
|
* @param {string} [options.cancelText=Cancel] - text for the cancel button
|
|
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
|
|
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
|
|
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
|
|
* @returns {string} - the key used for this modal
|
|
*/
|
|
|
|
|
|
BdApi.showConfirmationModal = function (title, content, options = {}) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, options);
|
|
}; //Show toast alert
|
|
|
|
|
|
BdApi.showToast = function (content, options = {}) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].showToast(content, options);
|
|
}; // Finds module
|
|
|
|
|
|
BdApi.findModule = function (filter) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.find(filter);
|
|
}; // Finds module
|
|
|
|
|
|
BdApi.findAllModules = function (filter) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findAll(filter);
|
|
}; // Finds module
|
|
|
|
|
|
BdApi.findModuleByProps = function (...props) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByUniqueProperties(props);
|
|
};
|
|
|
|
BdApi.findModuleByPrototypes = function (...protos) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByPrototypes(protos);
|
|
};
|
|
|
|
BdApi.findModuleByDisplayName = function (name) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByDisplayName(name);
|
|
}; // Gets react instance
|
|
|
|
|
|
BdApi.getInternalInstance = function (node) {
|
|
if (!(node instanceof window.jQuery) && !(node instanceof Element)) return undefined;
|
|
if (node instanceof jQuery) node = node[0];
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].getInternalInstance(node);
|
|
}; // Gets data
|
|
|
|
|
|
BdApi.loadData = function (pluginName, key) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getPluginData(pluginName, key);
|
|
};
|
|
|
|
BdApi.getData = BdApi.loadData; // Sets data
|
|
|
|
BdApi.saveData = function (pluginName, key, data) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setPluginData(pluginName, key, data);
|
|
};
|
|
|
|
BdApi.setData = BdApi.saveData; // Deletes data
|
|
|
|
BdApi.deleteData = function (pluginName, key) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].deletePluginData(pluginName, key);
|
|
}; // Patches other functions
|
|
|
|
|
|
BdApi.monkeyPatch = function (what, methodName, options) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(what, methodName, options);
|
|
}; // Event when element is removed
|
|
|
|
|
|
BdApi.onRemoved = function (node, callback) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].onRemoved(node, callback);
|
|
}; // Wraps function in try..catch
|
|
|
|
|
|
BdApi.suppressErrors = function (method, message) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].suppressErrors(method, message);
|
|
}; // Tests for valid JSON
|
|
|
|
|
|
BdApi.testJSON = function (data) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].testJSON(data);
|
|
};
|
|
|
|
BdApi.isPluginEnabled = function (name) {
|
|
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name];
|
|
};
|
|
|
|
BdApi.isThemeEnabled = function (name) {
|
|
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name];
|
|
};
|
|
|
|
BdApi.isSettingEnabled = function (id) {
|
|
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id];
|
|
};
|
|
|
|
BdApi.enableSetting = function (id) {
|
|
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, true);
|
|
};
|
|
|
|
BdApi.disableSetting = function (id) {
|
|
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, false);
|
|
};
|
|
|
|
BdApi.toggleSetting = function (id) {
|
|
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, !_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]);
|
|
}; // Gets data
|
|
|
|
|
|
BdApi.getBDData = function (key) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getBDData(key);
|
|
}; // Sets data
|
|
|
|
|
|
BdApi.setBDData = function (key, data) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setBDData(key, data);
|
|
};
|
|
|
|
const makeAddonAPI = (cookie, list, manager) => new class AddonAPI {
|
|
get folder() {
|
|
return manager.folder;
|
|
}
|
|
|
|
isEnabled(name) {
|
|
return !!cookie[name];
|
|
}
|
|
|
|
enable(name) {
|
|
return manager.enable(name);
|
|
}
|
|
|
|
disable(name) {
|
|
return manager.disable(name);
|
|
}
|
|
|
|
toggle(name) {
|
|
if (cookie[name]) this.disable(name);else this.enable(name);
|
|
}
|
|
|
|
reload(name) {
|
|
return manager.reload(name);
|
|
}
|
|
|
|
get(name) {
|
|
if (list.hasOwnProperty(name)) {
|
|
if (list[name].plugin) return list[name].plugin;
|
|
return list[name];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
getAll() {
|
|
return Object.keys(list).map(k => this.get(k)).filter(a => a);
|
|
}
|
|
|
|
}();
|
|
|
|
BdApi.Plugins = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"], _pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
BdApi.Themes = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"], _themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
/* harmony default export */ __webpack_exports__["default"] = (BdApi);
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/bdEvents.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/modules/bdEvents.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* BDEvents */
|
|
const EventEmitter = __webpack_require__(/*! events */ "events");
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class BDEvents extends EventEmitter {
|
|
dispatch(eventName, ...args) {
|
|
this.emit(eventName, ...args);
|
|
}
|
|
|
|
off(eventName, eventAction) {
|
|
this.removeListener(eventName, eventAction);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/blurPrivate.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/blurPrivate.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/**
|
|
* Credits to @hellbound1337 on github for the css
|
|
*/
|
|
|
|
|
|
let selectors;
|
|
const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa;
|
|
|
|
function getSelectors() {
|
|
let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0];
|
|
if (!standardSidebarView) return null;
|
|
let defaultClassName = removeDa(standardSidebarView.standardSidebarView);
|
|
let selects = [];
|
|
selects.push(`#app-mount .${defaultClassName} .payment-info .${removeDa(BDModules.get(e => e.description && typeof e.description === "string" && e.description.includes("formText"))[0].description)}`);
|
|
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.paymentSourceRow)[0].paymentSourceRow)} .${removeDa(BDModules.get(e => e.subText && e.descriptionWrapper)[0].subText)}`);
|
|
selects.push(`#app-mount .${defaultClassName} .${removeDa(BDModules.get(e => e.userSettingsAccount)[0].userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
|
|
return selects;
|
|
}
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class BlurPrivate {
|
|
constructor() {
|
|
this.enabled = false;
|
|
}
|
|
|
|
enable() {
|
|
if (this.enabled) return;
|
|
this.enabled = true;
|
|
selectors = selectors || getSelectors();
|
|
if (!selectors) console.error(new Error("Couldn't find selectors to blur personnal informations."));
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("blurPrivate", `
|
|
${selectors[0]}, ${selectors[1]}, ${selectors[2]} {
|
|
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
|
|
filter: blur(4px);
|
|
opacity: .8;
|
|
}
|
|
|
|
${selectors[0]}:hover, ${selectors[1]}:hover, ${selectors[2]}:hover {
|
|
transition: all 150ms cubic-bezier(.55,.09,.68,.53);
|
|
filter: none;
|
|
opacity: 1;
|
|
}`);
|
|
}
|
|
|
|
disable() {
|
|
if (!this.enabled) return;
|
|
this.enabled = false;
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/classNormalizer.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/modules/classNormalizer.js ***!
|
|
\****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
|
|
const normalizedPrefix = "da";
|
|
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer {
|
|
stop() {
|
|
if (!this.hasPatched) return;
|
|
this.unpatchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
|
|
this.revertElement(document.querySelector("#app-mount"));
|
|
this.hasPatched = false;
|
|
}
|
|
|
|
start() {
|
|
if (this.hasPatched) return;
|
|
this.patchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
|
|
this.normalizeElement(document.querySelector("#app-mount"));
|
|
this.hasPatched = true;
|
|
this.patchDOMMethods();
|
|
}
|
|
|
|
patchClassModules(modules) {
|
|
for (const module of modules) {
|
|
this.patchClassModule(normalizedPrefix, module);
|
|
}
|
|
}
|
|
|
|
unpatchClassModules(modules) {
|
|
for (const module of modules) {
|
|
this.unpatchClassModule(normalizedPrefix, module);
|
|
}
|
|
}
|
|
|
|
shouldIgnore(value) {
|
|
if (!isNaN(value)) return true;
|
|
if (value.endsWith("px") || value.endsWith("ch") || value.endsWith("em") || value.endsWith("ms")) return true;
|
|
if (value.startsWith("layerContainer-")) return true;
|
|
if (value.startsWith("#") && (value.length == 7 || value.length == 4)) return true;
|
|
if (value.includes("calc(") || value.includes("rgba")) return true;
|
|
return false;
|
|
}
|
|
|
|
moduleFilter(module) {
|
|
if (typeof module !== "object" || Array.isArray(module)) return false;
|
|
if (module.__esModule) return false;
|
|
if (!Object.keys(module).length) return false;
|
|
|
|
for (const baseClassName in module) {
|
|
const value = module[baseClassName];
|
|
if (typeof value !== "string") return false;
|
|
if (this.shouldIgnore(value)) continue;
|
|
if (value.split("-").length === 1) return false;
|
|
if (!randClass.test(value.split(" ")[0])) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
patchClassModule(componentName, classNames) {
|
|
for (const baseClassName in classNames) {
|
|
const value = classNames[baseClassName];
|
|
if (this.shouldIgnore(value)) continue;
|
|
const classList = value.split(" ");
|
|
|
|
for (const normalClass of classList) {
|
|
const match = normalClass.match(randClass);
|
|
if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know
|
|
|
|
const camelCase = match[1].split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
|
|
classNames[baseClassName] += ` ${componentName}-${camelCase}`;
|
|
}
|
|
}
|
|
}
|
|
|
|
unpatchClassModule(componentName, classNames) {
|
|
for (const baseClassName in classNames) {
|
|
const value = classNames[baseClassName];
|
|
if (this.shouldIgnore(value)) continue;
|
|
let newString = "";
|
|
const classList = value.split(" ");
|
|
|
|
for (const normalClass of classList) {
|
|
if (normalClass.startsWith(`${componentName}-`)) continue;
|
|
newString += ` ${normalClass}`;
|
|
}
|
|
|
|
classNames[baseClassName] = newString.trim();
|
|
}
|
|
}
|
|
|
|
normalizeElement(element) {
|
|
if (!(element instanceof Element)) return;
|
|
const classes = element.classList;
|
|
|
|
for (let c = 0, clen = classes.length; c < clen; c++) {
|
|
if (!randClass.test(classes[c])) continue;
|
|
const match = classes[c].match(randClass)[1];
|
|
const newClass = match.split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
|
|
element.classList.add(`${normalizedPrefix}-${newClass}`);
|
|
}
|
|
|
|
for (const child of element.children) this.normalizeElement(child);
|
|
}
|
|
|
|
revertElement(element) {
|
|
if (!(element instanceof Element)) return;
|
|
if (element.children && element.children.length) this.revertElement(element.children[0]);
|
|
if (element.nextElementSibling) this.revertElement(element.nextElementSibling);
|
|
const classes = element.classList;
|
|
const toRemove = [];
|
|
|
|
for (let c = 0; c < classes.length; c++) {
|
|
if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]);
|
|
}
|
|
|
|
element.classList.remove(...toRemove);
|
|
}
|
|
|
|
patchDOMMethods() {
|
|
const contains = DOMTokenList.prototype.contains;
|
|
|
|
DOMTokenList.prototype.contains = function (token) {
|
|
// const tokens = token.split(" ");
|
|
return Reflect.apply(contains, this, [token.split(" ")[0]]); // return tokens.every(t => contains.call(this, t));
|
|
};
|
|
|
|
const add = DOMTokenList.prototype.add;
|
|
|
|
DOMTokenList.prototype.add = function (...tokens) {
|
|
for (let t = 0; t < tokens.length; t++) {
|
|
tokens[t] = tokens[t].split(" ")[0];
|
|
}
|
|
|
|
return Reflect.apply(add, this, tokens);
|
|
};
|
|
|
|
const remove = DOMTokenList.prototype.remove;
|
|
|
|
DOMTokenList.prototype.remove = function (...tokens) {
|
|
for (let t = 0; t < tokens.length; t++) {
|
|
tokens[t] = tokens[t].split(" ")[0];
|
|
}
|
|
|
|
return Reflect.apply(remove, this, tokens);
|
|
};
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/coloredText.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/coloredText.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class ColoredText {
|
|
injectColoredText() {
|
|
if (this.cancelColoredText) return;
|
|
if (!_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent) return;
|
|
this.cancelColoredText = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent, "default", {
|
|
before: data => {
|
|
const props = data.methodArguments[0];
|
|
if (!props || !props.childrenMessageContent) return;
|
|
const messageContent = props.childrenMessageContent;
|
|
if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != "MessageContent") return;
|
|
const originalType = messageContent.type.type;
|
|
if (originalType.__originalMethod) return; // Don't patch again
|
|
|
|
messageContent.type.type = function (props) {
|
|
const returnValue = originalType(props);
|
|
const roleColor = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"] ? props.message.colorString || "" : "";
|
|
returnValue.props.style = {
|
|
color: roleColor
|
|
};
|
|
return returnValue;
|
|
};
|
|
|
|
messageContent.type.type.__originalMethod = originalType;
|
|
Object.assign(messageContent.type.type, originalType);
|
|
}
|
|
});
|
|
}
|
|
|
|
removeColoredText() {
|
|
let classNameMarkup = BDModules.get(e => e.markup)[0].markup;
|
|
document.querySelectorAll("." + classNameMarkup.split(" ")[0]).forEach(elem => {
|
|
elem.style.setProperty("color", "");
|
|
});
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/contentManager.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/modules/contentManager.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! crypto */ "crypto");
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_4__);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const path = __webpack_require__(/*! path */ "path");
|
|
|
|
const fs = __webpack_require__(/*! fs */ "fs");
|
|
|
|
const Module = __webpack_require__(/*! module */ "module").Module;
|
|
|
|
Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules"));
|
|
|
|
class MetaError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "MetaError";
|
|
}
|
|
|
|
}
|
|
|
|
const originalJSRequire = Module._extensions[".js"];
|
|
const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => {
|
|
return null;
|
|
};
|
|
const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/;
|
|
const escapedAtRegex = /^\\@/;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
|
|
constructor() {
|
|
this.timeCache = {};
|
|
this.watchers = {};
|
|
Module._extensions[".js"] = this.getContentRequire("plugin");
|
|
Module._extensions[".css"] = this.getContentRequire("theme");
|
|
}
|
|
|
|
get pluginsFolder() {
|
|
return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/")));
|
|
}
|
|
|
|
get themesFolder() {
|
|
return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/")));
|
|
}
|
|
|
|
watchContent(contentType) {
|
|
if (this.watchers[contentType]) return;
|
|
const isPlugin = contentType === "plugin";
|
|
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
|
|
this.watchers[contentType] = fs.watch(baseFolder, {
|
|
persistent: false
|
|
}, async (eventType, filename) => {
|
|
if (!eventType || !filename || !filename.endsWith(fileEnding)) return;
|
|
await new Promise(r => setTimeout(r, 50));
|
|
|
|
try {
|
|
fs.statSync(path.resolve(baseFolder, filename));
|
|
} catch (err) {
|
|
if (err.code !== "ENOENT") return;
|
|
delete this.timeCache[filename];
|
|
if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename);
|
|
return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename);
|
|
}
|
|
|
|
if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;
|
|
const stats = fs.statSync(path.resolve(baseFolder, filename));
|
|
if (!stats || !stats.mtime || !stats.mtime.getTime()) return;
|
|
if (typeof stats.mtime.getTime() !== "number") return;
|
|
if (this.timeCache[filename] == stats.mtime.getTime()) return;
|
|
this.timeCache[filename] = stats.mtime.getTime();
|
|
|
|
if (eventType == "rename") {
|
|
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename);
|
|
}
|
|
|
|
if (eventType == "change") {
|
|
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename);
|
|
}
|
|
});
|
|
}
|
|
|
|
unwatchContent(contentType) {
|
|
if (!this.watchers[contentType]) return;
|
|
this.watchers[contentType].close();
|
|
delete this.watchers[contentType];
|
|
}
|
|
|
|
extractMeta(content) {
|
|
const firstLine = content.split("\n")[0];
|
|
const hasOldMeta = firstLine.includes("//META");
|
|
if (hasOldMeta) return this.parseOldMeta(content);
|
|
const hasNewMeta = firstLine.includes("/**");
|
|
if (hasNewMeta) return this.parseNewMeta(content);
|
|
throw new MetaError("META was not found.");
|
|
}
|
|
|
|
parseOldMeta(content) {
|
|
const meta = content.split("\n")[0];
|
|
const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//"));
|
|
if (meta.indexOf("META") < 0) throw new MetaError("META was not found.");
|
|
const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta);
|
|
if (!parsed) throw new MetaError("META could not be parsed.");
|
|
if (!parsed.name) throw new MetaError("META missing name data.");
|
|
parsed.format = "json";
|
|
return parsed;
|
|
}
|
|
|
|
parseNewMeta(content) {
|
|
const block = content.split("/**", 2)[1].split("*/", 1)[0];
|
|
const out = {};
|
|
let field = "";
|
|
let accum = "";
|
|
|
|
for (const line of block.split(splitRegex)) {
|
|
if (line.length === 0) continue;
|
|
|
|
if (line.charAt(0) === "@" && line.charAt(1) !== " ") {
|
|
out[field] = accum;
|
|
const l = line.indexOf(" ");
|
|
field = line.substr(1, l - 1);
|
|
accum = line.substr(l + 1);
|
|
} else {
|
|
accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@");
|
|
}
|
|
}
|
|
|
|
out[field] = accum.trim();
|
|
delete out[""];
|
|
out.format = "jsdoc";
|
|
return out;
|
|
}
|
|
|
|
getContentRequire(type) {
|
|
const isPlugin = type === "plugin";
|
|
const self = this;
|
|
const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;
|
|
return function (module, filename) {
|
|
const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;
|
|
const possiblePath = path.resolve(baseFolder, path.basename(filename));
|
|
if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);
|
|
let content = fs.readFileSync(filename, "utf8");
|
|
content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content);
|
|
const stats = fs.statSync(filename);
|
|
const meta = self.extractMeta(content);
|
|
meta.filename = path.basename(filename);
|
|
meta.added = stats.atimeMs;
|
|
meta.modified = stats.mtimeMs;
|
|
meta.size = stats.size;
|
|
|
|
if (!isPlugin) {
|
|
meta.css = content;
|
|
if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n");
|
|
content = `module.exports = ${JSON.stringify(meta)};`;
|
|
}
|
|
|
|
if (isPlugin) {
|
|
module._compile(content, module.filename);
|
|
|
|
const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports);
|
|
|
|
if (didExport) {
|
|
meta.type = module.exports;
|
|
module.exports = meta;
|
|
content = "";
|
|
} else {
|
|
// Utils.warn("Module Not Exported", `${meta.name}, please start setting module.exports`);
|
|
content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`;
|
|
}
|
|
}
|
|
|
|
module._compile(content, filename);
|
|
};
|
|
}
|
|
|
|
makePlaceholderPlugin(data) {
|
|
return {
|
|
plugin: {
|
|
start: () => {},
|
|
getName: () => {
|
|
return data.name || data.filename;
|
|
},
|
|
getAuthor: () => {
|
|
return "???";
|
|
},
|
|
getDescription: () => {
|
|
return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates.";
|
|
},
|
|
getVersion: () => {
|
|
return "???";
|
|
}
|
|
},
|
|
name: data.name || data.filename,
|
|
filename: data.filename,
|
|
source: data.source ? data.source : "",
|
|
website: data.website ? data.website : ""
|
|
};
|
|
}
|
|
|
|
async loadContent(filename, type) {
|
|
if (typeof filename === "undefined" || typeof type === "undefined") return;
|
|
const isPlugin = type === "plugin";
|
|
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
|
|
try {
|
|
window.require(path.resolve(baseFolder, filename));
|
|
} catch (error) {
|
|
return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "Could not be compiled.",
|
|
error: {
|
|
message: error.message,
|
|
stack: error.stack
|
|
}
|
|
};
|
|
}
|
|
|
|
const content = window.require(path.resolve(baseFolder, filename));
|
|
|
|
if (!content.name) return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "Cannot escape the ID.",
|
|
error: {
|
|
message: "Cannot read property 'replace' of undefined",
|
|
stack: "Cannot read property 'replace' of undefined"
|
|
}
|
|
};
|
|
content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name);
|
|
|
|
if (isPlugin) {
|
|
if (!content.type) return;
|
|
|
|
try {
|
|
content.plugin = new content.type();
|
|
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()];
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][content.plugin.getName()] = content;
|
|
} catch (error) {
|
|
return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "Could not be constructed.",
|
|
error: {
|
|
message: error.message,
|
|
stack: error.stack
|
|
}
|
|
};
|
|
}
|
|
} else {
|
|
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name];
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][content.name] = content;
|
|
}
|
|
}
|
|
|
|
unloadContent(filename, type) {
|
|
if (typeof filename === "undefined" || typeof type === "undefined") return;
|
|
const isPlugin = type === "plugin";
|
|
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
|
|
try {
|
|
delete window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
|
|
} catch (err) {
|
|
return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "Could not be unloaded.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
};
|
|
}
|
|
}
|
|
|
|
isLoaded(filename, type) {
|
|
const isPlugin = type === "plugin";
|
|
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
|
|
try {
|
|
window.require.cache[window.require.resolve(path.resolve(baseFolder, filename))];
|
|
} catch (err) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
async reloadContent(filename, type) {
|
|
const cantUnload = this.unloadContent(filename, type);
|
|
if (cantUnload) return cantUnload;
|
|
return await this.loadContent(filename, type);
|
|
}
|
|
|
|
loadNewContent(type) {
|
|
const isPlugin = type === "plugin";
|
|
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
|
|
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
const files = fs.readdirSync(basedir);
|
|
const contentList = Object.values(isPlugin ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"] : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
|
|
const removed = contentList.filter(t => !files.includes(t.filename)).map(c => isPlugin ? c.plugin.getName() : c.name);
|
|
const added = files.filter(f => !contentList.find(t => t.filename == f) && f.endsWith(fileEnding) && fs.statSync(path.resolve(basedir, f)).isFile());
|
|
return {
|
|
added,
|
|
removed
|
|
};
|
|
}
|
|
|
|
async loadAllContent(type) {
|
|
const isPlugin = type === "plugin";
|
|
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
|
|
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
const errors = [];
|
|
const files = fs.readdirSync(basedir);
|
|
|
|
for (const filename of files) {
|
|
if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;
|
|
const error = await this.loadContent(filename, type);
|
|
if (error) errors.push(error);
|
|
}
|
|
|
|
return errors;
|
|
}
|
|
|
|
loadPlugins() {
|
|
return this.loadAllContent("plugin");
|
|
}
|
|
|
|
loadThemes() {
|
|
return this.loadAllContent("theme");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/core.js":
|
|
/*!*****************************!*\
|
|
!*** ./src/modules/core.js ***!
|
|
\*****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
|
|
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js");
|
|
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
/* harmony import */ var _svg_lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/lightcord */ "./src/svg/lightcord.jsx");
|
|
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
|
|
/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js");
|
|
/* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function Core() {// Object.assign(bdConfig, __non_webpack_require__(DataStore.configFile));
|
|
// this.init();
|
|
}
|
|
|
|
Core.prototype.setConfig = function (config) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
|
|
};
|
|
|
|
Core.prototype.init = async function () {
|
|
if (!Array.prototype.flat) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding.");
|
|
return;
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").<br><br> Please download the latest version from <a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>GitHub</a>");
|
|
return;
|
|
}
|
|
|
|
if (window.ED) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");
|
|
return;
|
|
}
|
|
|
|
if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes("Patched")) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with Powercord. Please uninstall one of them.");
|
|
return;
|
|
}
|
|
/*
|
|
const latestLocalVersion = bdConfig.updater ? bdConfig.updater.LatestVersion : bdConfig.latestVersion;
|
|
if (latestLocalVersion > bdConfig.version) {
|
|
Utils.showConfirmationModal("Update Available", [`There is an update available for BandagedBD's Injector (${latestLocalVersion}).`, "You can either update and restart now, or later."], {
|
|
confirmText: "Update Now",
|
|
cancelText: "Maybe Later",
|
|
onConfirm: async () => {
|
|
const onUpdateFailed = () => {Utils.alert("Could Not Update", `Unable to update automatically, please download the installer and reinstall normally.<br /><br /><a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>Download Installer</a>`);};
|
|
try {
|
|
const didUpdate = await this.updateInjector();
|
|
if (!didUpdate) return onUpdateFailed();
|
|
const app = require("electron").remote.app;
|
|
app.relaunch();
|
|
app.exit();
|
|
}
|
|
catch (err) {
|
|
onUpdateFailed();
|
|
}
|
|
}
|
|
});
|
|
}*/
|
|
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings");
|
|
this.initSettings();
|
|
await this.checkForGuilds();
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings");
|
|
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins");
|
|
await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes");
|
|
await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes();
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", atob(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss")));
|
|
window.addEventListener("beforeunload", function () {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click();
|
|
});
|
|
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon");
|
|
if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer");
|
|
this.initObserver(); // Show loading errors
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors");
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({
|
|
plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"],
|
|
themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"]
|
|
});
|
|
}
|
|
|
|
const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version");
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]);
|
|
}
|
|
|
|
_emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"].start();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchSocial.bind(this), "BD Social Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildPills.bind(this), "BD Guild Pills Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildListItems.bind(this), "BD Guild List Items Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttachment.bind(this), "LC Plugin Certifier Patch")();
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].haveInstalledDefault) {
|
|
let alert = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.");
|
|
await new Promise(resolve => {
|
|
alert.onClose(resolve);
|
|
});
|
|
}
|
|
|
|
const logo = document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark");
|
|
|
|
if (logo) {
|
|
logo.style.top = "3px";
|
|
logo.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" height="10" width="70" viewBox="0 0 72.54 10" style="margin-left: -5px, margin-top: 10px">
|
|
<path fill="currentColor" d="M44.81,9.67V6.33c0-1.21,2.13-1.49,2.78-.28l2-.81A3.53,3.53,0,0,0,46.2,3c-1.92,0-3.81,1.13-3.81,3.33V9.67c0,2.21,1.89,3.33,3.77,3.33a3.87,3.87,0,0,0,3.45-2.18l-2.12-1C47,11.17,44.81,10.85,44.81,9.67ZM10.68,12.89h2.41V3.17H10.68ZM71.76,3.14H68.19V7.23L70.57,9.4v-4h1.27c.81,0,1.21.41,1.21,1v3c0,.63-.38,1.05-1.21,1.05H68.18v2.31h3.57c1.92,0,3.72-1,3.72-3.2V6.39C75.48,4.13,73.68,3.14,71.76,3.14ZM54.22,3c-2,0-4,1.1-4,3.34V9.66c0,2.23,2,3.34,4,3.34s3.95-1.11,3.95-3.34V6.34C58.19,4.11,56.2,3,54.22,3Zm1.55,6.66c0,.7-.78,1.06-1.54,1.06s-1.55-.35-1.55-1.06V6.34c0-.72.75-1.1,1.5-1.1s1.59.35,1.59,1.1ZM66.84,6.34c0-2.29-1.58-3.2-3.55-3.2H59.46v9.73h2.45V9.77h.43l2.22,3.09h3L65,9.52C66.13,9.15,66.84,8.14,66.84,6.34ZM63.33,7.65H61.91V5.43h1.42A1.11,1.11,0,1,1,63.33,7.65ZM29.83,13h2.42V3.06H29.83V6.73l-3,0V3.09H24.7v9.78h2.14V8.68l3,0ZM17.16,9.76V6.42c0-1.21,2.13-1.49,2.78-.28l2-.81a3.55,3.55,0,0,0-3.36-2.24c-1.92,0-3.81,1.13-3.81,3.33V9.76c0,2.21,2,3.15,3.9,3.15s3.58-1,3.58-3V7.58H18.79l0,1.36H20.3v.77C20.3,10.92,17.16,10.94,17.16,9.76Z" transform="translate(-2.93 -3)"/>
|
|
<polygon fill="currentColor" points="35.91 0.06 38.43 0.06 38.43 1.84 35.92 1.81 35.97 10 33.55 10 33.49 1.75 30.98 1.74 30.98 0.06 33.49 0.06 35.91 0.06"/>
|
|
<polygon fill="currentColor" points="0 9.97 6.5 10 6.5 7.63 2.41 7.63 2.41 0.26 0 2.26 0 9.97"/>
|
|
</svg>`;
|
|
}
|
|
};
|
|
|
|
Core.prototype.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();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
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 (!document.getElementById("bd-settings-sidebar")) _settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar();
|
|
}
|
|
}
|
|
|
|
if (node.parentElement == document.body && node.querySelector("#ace_settingsmenu")) node.id = "ace_settingsmenu_container";
|
|
/*
|
|
if(node.classList.contains(classNameModal)){
|
|
try{
|
|
/**
|
|
* @type {Element}
|
|
*/
|
|
|
|
/*
|
|
const UserProfile = Utils.getNestedProp(node, "childNodes.0.childNodes.0")
|
|
let user = BDV2.getInternalInstance(node).pendingProps.children.props.children.props.user
|
|
console.log(user)
|
|
if(UserProfile && UserProfile.childNodes.length === 2){
|
|
let header = UserProfile.childNodes[0].childNodes[0]
|
|
|
|
let children = BDV2.getInternalInstance(header).return.pendingProps.children[1]
|
|
console.log(children)
|
|
children.push(BDV2.react.createElement("p", {}, "sltsv"))
|
|
}
|
|
}catch(e){
|
|
console.error("An error occured in Badge Rendering:", e)
|
|
}
|
|
}*/
|
|
// 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;
|
|
returnValue.props.className += " bd-guild";
|
|
if (guildData.unread) returnValue.props.className += " bd-unread";
|
|
if (guildData.selected) returnValue.props.className += " bd-selected";
|
|
if (guildData.audio) returnValue.props.className += " bd-audio";
|
|
if (guildData.video) returnValue.props.className += " bd-video";
|
|
if (guildData.badge) returnValue.props.className += " bd-badge";
|
|
if (guildData.animatable) returnValue.props.className += " bd-animatable";
|
|
return returnValue;
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchGuildPills = function () {
|
|
if (this.guildPillPatch) return;
|
|
const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d"));
|
|
if (!guildPill) return;
|
|
this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", {
|
|
after: data => {
|
|
const props = data.methodArguments[0];
|
|
if (props.unread) data.returnValue.props.className += " bd-unread";
|
|
if (props.selected) data.returnValue.props.className += " bd-selected";
|
|
if (props.hovered) data.returnValue.props.className += " bd-hovered";
|
|
return data.returnValue;
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchGuildSeparator = function () {
|
|
if (this.guildSeparatorPatch) return;
|
|
const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds");
|
|
const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem");
|
|
if (!guildComponents || !Guilds) return;
|
|
|
|
const GuildSeparator = function () {
|
|
const returnValue = guildComponents.Separator(...arguments);
|
|
returnValue.props.className += " bd-guild-separator";
|
|
return returnValue;
|
|
};
|
|
|
|
this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", {
|
|
after: data => {
|
|
data.returnValue.props.children[1].props.children[3].type = GuildSeparator;
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchAttachment = function () {
|
|
if (this.AttachmentPatch) return;
|
|
const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary
|
|
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!Anchor || !Attachment || !Attachment.default) return;
|
|
this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", {
|
|
after: data => {
|
|
const attachment = data.methodArguments[0] || null;
|
|
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
|
|
if (!children || !attachment || !attachment.url) return;
|
|
if (!Array.isArray(children)) return;
|
|
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
id: "certified-" + id
|
|
}));
|
|
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id);
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchMessageHeader = function () {
|
|
if (this.messageHeaderPatch) return;
|
|
const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp");
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!Anchor || !MessageHeader || !MessageHeader.default) return;
|
|
this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", {
|
|
after: data => {
|
|
const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props");
|
|
|
|
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children");
|
|
if (!children || !author || !author.id) return; // if (header && header.className) header.className += " "
|
|
|
|
if (!Array.isArray(children)) return;
|
|
|
|
if (author.id === "249746236008169473") {
|
|
// Rauenzi: BandagedBD Developer
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BandagedBD Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-chat-badge",
|
|
href: "https://github.com/rauenzi/BetterDiscordApp",
|
|
title: "BandagedBD",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
} else if (author.id === "696481194443014174" || author.id === "696003456611385396") {
|
|
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-chat-badge",
|
|
href: "https://github.com/Lightcord/Lightcord",
|
|
title: "Lightcord",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
} // TODO: fix 12787689 badges duplicate
|
|
|
|
|
|
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;
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
_distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => {
|
|
badges.forEach(badge => {
|
|
const props = {
|
|
svg: {
|
|
size: "16px",
|
|
className: "bd-logo",
|
|
width: "16px"
|
|
}
|
|
};
|
|
badge.scopes.forEach(scope => {
|
|
if (scope === "user") {
|
|
// require user
|
|
props.user = user;
|
|
}
|
|
});
|
|
|
|
if (!badge.href) {
|
|
props.Anchor = Anchor;
|
|
props.href = {
|
|
className: chat ? "bd-chat-badge" : "bd-member-badge",
|
|
title: badge.name,
|
|
target: "_blank"
|
|
};
|
|
}
|
|
|
|
const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: badge.name
|
|
}, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, {
|
|
href: badge.href,
|
|
className: chat ? "bd-chat-badge" : "bd-member-badge",
|
|
title: badge.name,
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props));
|
|
const div2 = document.createElement("div");
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2);
|
|
div2.childNodes.forEach(node => {
|
|
div.appendChild(node);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
Core.prototype.patchMemberList = function () {
|
|
if (this.memberListPatch) return;
|
|
const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem");
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;
|
|
this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", {
|
|
after: data => {
|
|
const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user");
|
|
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
|
|
if (!children || !user || !user.id) return; // if (header && header.className) header.className += " "
|
|
|
|
if (!Array.isArray(children)) return;
|
|
|
|
if (user.id === "249746236008169473") {
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BandagedBD Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-member-badge",
|
|
href: "https://github.com/rauenzi/BetterDiscordApp",
|
|
title: "BandagedBD",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
} else if (user.id === "696481194443014174" || user.id === "696003456611385396") {
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-member-badge",
|
|
href: "https://github.com/Lightcord/Lightcord",
|
|
title: "Lightcord",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
}
|
|
|
|
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
|
|
id: "badges-" + id
|
|
}));
|
|
applyBadges(id, user, false);
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.updateInjector = async function () {
|
|
const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath;
|
|
if (!injectionPath) return false;
|
|
|
|
const fs = __webpack_require__(/*! fs */ "fs");
|
|
|
|
const path = __webpack_require__(/*! path */ "path");
|
|
|
|
const rmrf = __webpack_require__(/*! rimraf */ "rimraf");
|
|
|
|
const yauzl = __webpack_require__(/*! yauzl */ "yauzl");
|
|
|
|
const mkdirp = __webpack_require__(/*! mkdirp */ "mkdirp");
|
|
|
|
const request =
|
|
/*require("request");*/
|
|
null;
|
|
const parentPath = path.resolve(injectionPath, "..");
|
|
const folderName = path.basename(injectionPath);
|
|
const zipLink = "https://github.com/rauenzi/BetterDiscordApp/archive/injector.zip";
|
|
const savedZip = path.resolve(parentPath, "injector.zip");
|
|
const extractedFolder = path.resolve(parentPath, "BetterDiscordApp-injector"); // Download the injector zip file
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Downloading " + zipLink);
|
|
let success = await new Promise(resolve => {
|
|
request.get({
|
|
url: zipLink,
|
|
encoding: null
|
|
}, async (error, response, body) => {
|
|
if (error || response.statusCode !== 200) return resolve(false); // Save a backup in case someone has their own copy
|
|
|
|
const alreadyExists = await new Promise(res => fs.exists(savedZip, res));
|
|
if (alreadyExists) await new Promise(res => fs.rename(savedZip, `${savedZip}.bak${Math.round(performance.now())}`, res));
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Writing " + savedZip);
|
|
fs.writeFile(savedZip, body, err => resolve(!err));
|
|
});
|
|
});
|
|
if (!success) return success; // Check and delete rename extraction
|
|
|
|
const alreadyExists = await new Promise(res => fs.exists(extractedFolder, res));
|
|
if (alreadyExists) await new Promise(res => fs.rename(extractedFolder, `${extractedFolder}.bak${Math.round(performance.now())}`, res)); // Unzip the downloaded zip file
|
|
|
|
const zipfile = await new Promise(r => yauzl.open(savedZip, {
|
|
lazyEntries: true
|
|
}, (err, zip) => r(zip)));
|
|
zipfile.on("entry", function (entry) {
|
|
// Skip directories, they are handled with mkdirp
|
|
if (entry.fileName.endsWith("/")) return zipfile.readEntry();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Extracting " + entry.fileName); // Make any needed parent directories
|
|
|
|
const fullPath = path.resolve(parentPath, entry.fileName);
|
|
mkdirp.sync(path.dirname(fullPath));
|
|
zipfile.openReadStream(entry, function (err, readStream) {
|
|
if (err) return success = false;
|
|
readStream.on("end", function () {
|
|
zipfile.readEntry();
|
|
}); // Go to next file after this
|
|
|
|
readStream.pipe(fs.createWriteStream(fullPath));
|
|
});
|
|
});
|
|
zipfile.readEntry(); // Start reading
|
|
// Wait for the final file to finish
|
|
|
|
await new Promise(resolve => zipfile.once("end", resolve)); // Save a backup in case something goes wrong during final step
|
|
|
|
const backupFolder = path.resolve(parentPath, `${folderName}.bak${Math.round(performance.now())}`);
|
|
await new Promise(resolve => fs.rename(injectionPath, backupFolder, resolve)); // Rename the extracted folder to what it should be
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);
|
|
success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));
|
|
|
|
if (!success) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Failed to rename the final directory");
|
|
return success;
|
|
} // If rename had issues, delete what we tried to rename and restore backup
|
|
|
|
|
|
if (!success) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("InjectorUpdate", "Something went wrong... restoring backups.");
|
|
await new Promise(resolve => rmrf(extractedFolder, resolve));
|
|
await new Promise(resolve => fs.rename(backupFolder, injectionPath, resolve));
|
|
return success;
|
|
} // If we've gotten to this point, everything should have gone smoothly.
|
|
// Cleanup the backup folder then remove the zip
|
|
|
|
|
|
await new Promise(resolve => rmrf(backupFolder, resolve));
|
|
await new Promise(resolve => fs.unlink(savedZip, resolve));
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("InjectorUpdate", "Injector Updated!");
|
|
return success;
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new Core());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/dataStore.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/modules/dataStore.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
const __non_webpack_require__ = window.require;
|
|
|
|
|
|
|
|
|
|
const fs = __webpack_require__(/*! fs */ "fs");
|
|
|
|
const path = __webpack_require__(/*! path */ "path");
|
|
|
|
const releaseChannel = DiscordNative.globals ? DiscordNative.globals.releaseChannel : DiscordNative.app ? DiscordNative.app.getReleaseChannel() : "stable";
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DataStore {
|
|
constructor() {
|
|
this.data = {
|
|
settings: {
|
|
stable: {},
|
|
canary: {},
|
|
ptb: {}
|
|
}
|
|
};
|
|
this.pluginData = {};
|
|
}
|
|
|
|
initialize() {
|
|
try {
|
|
if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
|
|
const data = JSON.parse(fs.readFileSync(this.BDFile, "binary"));
|
|
if (data.hasOwnProperty("settings")) this.data = data;
|
|
if (!fs.existsSync(this.settingsFile)) return;
|
|
|
|
let settings = __non_webpack_require__(this.settingsFile);
|
|
|
|
fs.unlinkSync(this.settingsFile);
|
|
if (settings.hasOwnProperty("settings")) settings = Object.assign({
|
|
stable: {},
|
|
canary: {},
|
|
ptb: {}
|
|
}, {
|
|
[releaseChannel]: settings
|
|
});else settings = Object.assign({
|
|
stable: {},
|
|
canary: {},
|
|
ptb: {}
|
|
}, settings);
|
|
this.setBDData("settings", settings);
|
|
} catch (err) {
|
|
console.error(err);
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Corrupt Storage", "The bd storage has somehow become corrupt. You may either try to salvage the file or delete it then reload.");
|
|
}
|
|
}
|
|
|
|
get injectionPath() {
|
|
return this._injectionPath = null;
|
|
if (this._injectionPath) return this._injectionPath;
|
|
|
|
const electron = __webpack_require__(/*! electron */ "electron").remote.app;
|
|
|
|
const base = electron.getAppPath();
|
|
const roamingBase = electron.getPath("userData");
|
|
const roamingLocation = path.resolve(roamingBase, electron.getVersion(), "modules", "discord_desktop_core", "injector");
|
|
const location = path.resolve(base, "..", "app");
|
|
const realLocation = fs.existsSync(location) ? location : fs.existsSync(roamingLocation) ? roamingLocation : null;
|
|
if (!realLocation) return this._injectionPath = null;
|
|
return this._injectionPath = realLocation;
|
|
}
|
|
|
|
get configFile() {
|
|
return this._configFile || (this._configFile = path.resolve(this.injectionPath, "betterdiscord", "config.json"));
|
|
}
|
|
|
|
get BDFile() {
|
|
return this._BDFile || (this._BDFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdstorage.json"));
|
|
}
|
|
|
|
get settingsFile() {
|
|
return this._settingsFile || (this._settingsFile = path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath, "bdsettings.json"));
|
|
}
|
|
|
|
getPluginFile(pluginName) {
|
|
return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_2__["default"].pluginsFolder, pluginName + ".config.json");
|
|
}
|
|
|
|
getSettingGroup(key) {
|
|
return this.data.settings[releaseChannel][key] || null;
|
|
}
|
|
|
|
setSettingGroup(key, data) {
|
|
this.data.settings[releaseChannel][key] = data;
|
|
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
|
|
}
|
|
|
|
getBDData(key) {
|
|
return this.data[key] || "";
|
|
}
|
|
|
|
setBDData(key, value) {
|
|
this.data[key] = value;
|
|
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "binary");
|
|
}
|
|
|
|
getPluginData(pluginName, key) {
|
|
if (this.pluginData[pluginName] !== undefined) return this.pluginData[pluginName][key];
|
|
if (!fs.existsSync(this.getPluginFile(pluginName))) return undefined;
|
|
this.pluginData[pluginName] = JSON.parse(fs.readFileSync(this.getPluginFile(pluginName)));
|
|
return this.pluginData[pluginName][key];
|
|
}
|
|
|
|
setPluginData(pluginName, key, value) {
|
|
if (value === undefined) return;
|
|
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
|
|
this.pluginData[pluginName][key] = value;
|
|
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
|
|
}
|
|
|
|
deletePluginData(pluginName, key) {
|
|
if (this.pluginData[pluginName] === undefined) this.pluginData[pluginName] = {};
|
|
delete this.pluginData[pluginName][key];
|
|
fs.writeFileSync(this.getPluginFile(pluginName), JSON.stringify(this.pluginData[pluginName], null, 4), "binary");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/devMode.js":
|
|
/*!********************************!*\
|
|
!*** ./src/modules/devMode.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DevMode {
|
|
constructor() {
|
|
this.debugListener = this.debugListener.bind(this);
|
|
this.copySelectorListener = this.copySelectorListener.bind(this);
|
|
}
|
|
|
|
start() {
|
|
this.startDebugListener();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) this.startCopySelector();
|
|
}
|
|
|
|
stop() {
|
|
this.stopDebugListener();
|
|
this.stopCopySelector();
|
|
}
|
|
|
|
startDebugListener() {
|
|
this.stopDebugListener();
|
|
document.addEventListener("keydown", this.debugListener);
|
|
}
|
|
|
|
stopDebugListener() {
|
|
document.removeEventListener("keydown", this.debugListener);
|
|
}
|
|
|
|
startCopySelector() {
|
|
this.stopCopySelector();
|
|
document.addEventListener("contextmenu", this.copySelectorListener);
|
|
}
|
|
|
|
stopCopySelector() {
|
|
document.removeEventListener("contextmenu", this.copySelectorListener);
|
|
}
|
|
|
|
debugListener(e) {
|
|
if (e.which === 119 || e.which == 118) {
|
|
//F8
|
|
console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", "");
|
|
debugger; // eslint-disable-line no-debugger
|
|
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
}
|
|
}
|
|
|
|
copySelectorListener(e) {
|
|
try {
|
|
e.stopPropagation();
|
|
const selector = this.getSelector(e.target);
|
|
let [classLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0], BDModules.get(e => e.menu)[0]];
|
|
|
|
function attach() {
|
|
if (!classItems || !classLayer.layer) return console.log(classItems, classLayer.layer);
|
|
let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.menu));
|
|
|
|
if (!cm) {
|
|
const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount > ." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classLayer.layerContainer));
|
|
const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classLayer.layer}">`);
|
|
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.menu} ${classItems.styleFlexible} ${classItems.accommodateScrollbar} bd-context-menu" style=""></div>`);
|
|
cmWrap.append(cm);
|
|
container.append(cmWrap);
|
|
cmWrap.style.top = e.clientY + "px";
|
|
cmWrap.style.left = e.clientX + "px";
|
|
cmWrap.setAttribute("role", "menu");
|
|
cmWrap.setAttribute("tabindex", "-1");
|
|
cmWrap.id = "bd-copy-selector-context";
|
|
cmWrap.setAttribute("aria-label", "Copy Selector Actions");
|
|
const scrollerClasses = BDModules.get(e => e.scrollerWrap)[0];
|
|
const scrollerWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${scrollerClasses.scrollerWrap} ${scrollerClasses.scrollerThemed} ${scrollerClasses.themeGhostHairline}"></div>`);
|
|
const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${BDModules.get(e => e.scroller)[0].scroller} ${classItems.scroller}"></div>`);
|
|
scrollerWrap.append(scroller);
|
|
cm.append(scrollerWrap);
|
|
|
|
const removeCM = function (e) {
|
|
if (e.keyCode && e.keyCode !== 27) return;
|
|
cmWrap.remove();
|
|
document.removeEventListener("click", removeCM);
|
|
document.removeEventListener("contextmenu", removeCM);
|
|
document.removeEventListener("keyup", removeCM);
|
|
};
|
|
|
|
document.addEventListener("click", removeCM);
|
|
document.addEventListener("contextmenu", removeCM);
|
|
document.addEventListener("keyup", removeCM);
|
|
}
|
|
|
|
const cmWrap = cm.parentElement;
|
|
const scroller = cm.childNodes[0].childNodes[0];
|
|
const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="group"></div>`);
|
|
/**
|
|
* @type {HTMLElement}
|
|
*/
|
|
|
|
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.labelContainer} ${classItems.colorDefault}" role="menuitem" id="bd-copy-selector-item-cm"></div>`);
|
|
cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.label}">Copy Selector</div>`));
|
|
cmi.addEventListener("click", () => {
|
|
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].NativeModule.copy(selector);
|
|
cmWrap.style.display = "none";
|
|
});
|
|
cmi.addEventListener("mouseover", e => {
|
|
let elements = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].queryAll("div[role=menuitem]." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.focused));
|
|
elements && elements.forEach(elem => elem.classList.remove(classItems.focused));
|
|
cmi.classList.add(classItems.focused);
|
|
});
|
|
cmi.addEventListener("mouseout", e => {
|
|
cmi.classList.remove(classItems.focused);
|
|
});
|
|
cmg.append(cmi);
|
|
|
|
if (scroller.childNodes.length) {
|
|
// apend a separator
|
|
const separator = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="separator" class="${classItems.separator}"></div>`);
|
|
scroller.append(separator);
|
|
}
|
|
|
|
scroller.append(cmg);
|
|
|
|
if (cmWrap.clientHeight < cmWrap.scrollHeight) {
|
|
console.log("overflowing " + cmWrap.style.top);
|
|
cmWrap.style.top = cmWrap.style.top - cmg.clientHeight + "px";
|
|
console.log("overflowing" + cmWrap.style.top);
|
|
}
|
|
}
|
|
|
|
setTimeout(attach, 1);
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
}
|
|
|
|
getSelector(element) {
|
|
if (element.id) return `#${element.id}`;
|
|
/**
|
|
*
|
|
* @param {HTMLElement} el
|
|
*/
|
|
|
|
function fullPath(el) {
|
|
var names = [];
|
|
|
|
while (el.parentNode) {
|
|
if (el.id) {
|
|
names.unshift('#' + el.id);
|
|
break;
|
|
} else {
|
|
if (el == el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase() + Array.from(el.classList.entries()).map(e => "." + e).join(""));else {
|
|
for (var c = 1, e = el; e.previousElementSibling; e = e.previousElementSibling, c++);
|
|
|
|
names.unshift(el.tagName.toLowerCase() + (el.className || "").split(" ").map(e => "." + e).join("") + ":nth-child(" + c + ")");
|
|
}
|
|
el = el.parentNode;
|
|
}
|
|
}
|
|
|
|
return names.join(" > ");
|
|
}
|
|
|
|
return fullPath(element);
|
|
/*
|
|
const rules = this.getRules(element);
|
|
const latestRule = rules[rules.length - 1];
|
|
if (latestRule) return latestRule.selectorText;
|
|
else if (element.classList.length) return `.${Array.from(element.classList).join(".")}`;
|
|
return `.${Array.from(element.parentElement.classList).join(".")}`;*/
|
|
}
|
|
|
|
getRules(element, css = element.ownerDocument.styleSheets) {
|
|
//if (window.getMatchedCSSRules) return window.getMatchedCSSRules(element);
|
|
const sheets = [...css].filter(s => !s.href || !s.href.includes("BetterDiscordApp"));
|
|
const rules = sheets.map(s => [...(s.cssRules || [])]).flat();
|
|
const elementRules = rules.filter(r => r && r.selectorText && element.matches(r.selectorText) && r.style.length && r.selectorText.split(", ").length < 8 && !r.selectorText.split(", ").includes("*"));
|
|
return elementRules;
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/disableTyping.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/disableTyping.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DisableTyping {
|
|
constructor() {
|
|
window.Lightcord.Api.ensureExported(e => e.default && e.default.startTyping).then(typingModule => {
|
|
let self = this;
|
|
const startTyping = typingModule.default.startTyping;
|
|
|
|
typingModule.default.startTyping = function () {
|
|
if (self.disabled) return startTyping.call(this, ...arguments);
|
|
};
|
|
|
|
const stopTyping = typingModule.default.stopTyping;
|
|
|
|
typingModule.default.stopTyping = function () {
|
|
if (self.disabled) return stopTyping.call(this, ...arguments);
|
|
};
|
|
|
|
this.disabled = true;
|
|
});
|
|
}
|
|
|
|
disable() {
|
|
this.disabled = true;
|
|
}
|
|
|
|
enable() {
|
|
this.disabled = false;
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/distant.js":
|
|
/*!********************************!*\
|
|
!*** ./src/modules/distant.js ***!
|
|
\********************************/
|
|
/*! exports provided: uuidv4, default, Constants, Routes */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; });
|
|
/* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx");
|
|
/* harmony import */ var _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../svg/LightcordUser */ "./src/svg/LightcordUser.jsx");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! node-fetch */ "node-fetch");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
|
|
|
|
|
|
|
|
function uuidv4() {
|
|
// Generate UUID (No crypto rng)
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
var r = Math.random() * 16 | 0,
|
|
v = c == 'x' ? r : r & 0x3 | 0x8;
|
|
return v.toString(16);
|
|
});
|
|
}
|
|
const awaitingBadgesPromises = {};
|
|
let badgesToFetch = [];
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DistantServer {
|
|
constructor() {
|
|
this._cache = {
|
|
badges: {}
|
|
};
|
|
}
|
|
|
|
get cache() {
|
|
return this._cache;
|
|
}
|
|
|
|
set cache(data) {
|
|
if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data;
|
|
return this._cache = Object.assign(this._cache, data);
|
|
}
|
|
|
|
async delete() {
|
|
BdApi.showToast("Deleting all infos about you on Lightcord Servers...", {
|
|
type: "warn"
|
|
});
|
|
return handleRequest(Routes.delete, "delete").then(async res => {
|
|
if (res.status !== 200) {
|
|
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {
|
|
type: "error"
|
|
});
|
|
throw new Error(`Couldn't delete all informations: ${res.status + " " + res.statusText + " " + (await res.text())}`);
|
|
}
|
|
|
|
console.info(`Succesfully deleted informations.`);
|
|
BdApi.showToast("Succesfully deleted informations", {
|
|
type: "success"
|
|
});
|
|
window.Lightcord.Api.Authorization = null;
|
|
return res.json();
|
|
}).catch(err => {
|
|
BdApi.showToast("An error occured, couldn't delete informations. See console for more infos", {
|
|
type: "error"
|
|
});
|
|
throw new Error(`Couldn't delete all informations: ${err.stack}`);
|
|
});
|
|
}
|
|
/**
|
|
* Get custom badges from the user ID.
|
|
* @param {string} user The user ID
|
|
* @returns {Promise<Constants["badges"]>}
|
|
*/
|
|
|
|
|
|
async getBadges(user) {
|
|
if (this.cache.badges[user]) return this.cache.badges[user];
|
|
if (awaitingBadgesPromises[user]) return awaitingBadgesPromises[user];
|
|
let resolve;
|
|
const newPromise = new Promise(res => resolve = res);
|
|
awaitingBadgesPromises[user] = newPromise;
|
|
const badges = [];
|
|
|
|
for (let badge of Constants.badges) {
|
|
if (badge.defaultUsers.includes(user)) badges.push(badge);
|
|
}
|
|
|
|
const fetchedBadges = await new Promise(resolve => {
|
|
badgesToFetch.push([user, resolve]);
|
|
setTimeout(() => {
|
|
let users = badgesToFetch;
|
|
if (users.length === 0) return;
|
|
badgesToFetch = [];
|
|
handleRequest(Routes.badges, "POST", JSON.stringify(users.map(e => e[0]))).then(async res => {
|
|
if (res.status !== 200) {
|
|
// Couldn't fetch badges: server error
|
|
users.forEach(data => {
|
|
data[1]([]); // resolve no badge fetched
|
|
});
|
|
}
|
|
|
|
const responseBody = await res.json();
|
|
console.log(responseBody);
|
|
|
|
for (let user of responseBody) {
|
|
let promise = users.find(promise => promise[0] === user.user_id);
|
|
promise[1](user.badges);
|
|
}
|
|
}).catch(err => {
|
|
// Couldn't fetch badges: error
|
|
if (!(err instanceof LightcordError)) console.error(err);
|
|
users.forEach(data => {
|
|
data[1]([]); // resolve no badge fetched
|
|
});
|
|
});
|
|
}, 0);
|
|
});
|
|
|
|
for (let badge of fetchedBadges) {
|
|
if (!Constants.badges.find(e => e.id === badge)) continue; // We do not have the Component, skip it.
|
|
|
|
if (badges.find(e => e.id === badge)) continue; // Already inserted.
|
|
|
|
badges.push(Constants.badges.find(e => e.id === badge));
|
|
}
|
|
|
|
this.cache = {
|
|
badges: Object.assign(this.cache.badges, {
|
|
[user]: badges
|
|
})
|
|
};
|
|
setTimeout(() => {
|
|
delete this.cache.badges[user];
|
|
}, 600000);
|
|
resolve(badges);
|
|
delete awaitingBadgesPromises[user];
|
|
return badges;
|
|
}
|
|
|
|
}());
|
|
|
|
const handleRequest = function (route, method, data) {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_3__["settingsCookie"]["lightcord-5"]) {
|
|
console.warn(`Canceling request on ${route} with method ${method} and body`, data, "because of settings.");
|
|
return Promise.reject(new LightcordError("The current settings blocked the request."));
|
|
}
|
|
|
|
console.log(`Sending request on ${route} with method ${method} and body`, data);
|
|
return node_fetch__WEBPACK_IMPORTED_MODULE_2___default()(`${Constants.SERVER_URL}/api/v1${route}`, {
|
|
method,
|
|
headers: {
|
|
"CLIENT": "Lightcord",
|
|
"Authorization": window.Lightcord.Api.Authorization || "None::Anonymous"
|
|
},
|
|
...(data ? {
|
|
body: data
|
|
} : {})
|
|
});
|
|
};
|
|
|
|
class LightcordError extends Error {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.name = "LightcordError";
|
|
}
|
|
|
|
}
|
|
|
|
const Constants = {
|
|
SERVER_URL: "http://127.0.0.1",
|
|
badges: [// TODO:
|
|
{
|
|
name: "Lightcord User",
|
|
id: "01cfa7b0-7cdb-4b0e-8258-9c6a78235c93",
|
|
defaultUsers: [],
|
|
scopes: ["user"],
|
|
component: _svg_LightcordUser__WEBPACK_IMPORTED_MODULE_1__["default"]
|
|
}, {
|
|
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"
|
|
}]
|
|
};
|
|
const Routes = {
|
|
badges: `/users/badges`,
|
|
delete: `/delete`
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/domtools.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/modules/domtools.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DOMTools; });
|
|
/**
|
|
* Copyright 2018 Zachary Rauen
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is furnished
|
|
* to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* From: https://github.com/rauenzi/BDPluginLibrary
|
|
*/
|
|
|
|
/**
|
|
* @interface
|
|
* @name Offset
|
|
* @property {number} top - Top offset of the target element.
|
|
* @property {number} right - Right offset of the target element.
|
|
* @property {number} bottom - Bottom offset of the target element.
|
|
* @property {number} left - Left offset of the target element.
|
|
* @property {number} height - Outer height of the target element.
|
|
* @property {number} width - Outer width of the target element.
|
|
*/
|
|
|
|
/**
|
|
* Function that automatically removes added listener.
|
|
* @callback module:DOMTools~CancelListener
|
|
*/
|
|
class DOMTools {
|
|
static escapeID(id) {
|
|
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
|
|
}
|
|
/**
|
|
* Adds a style to the document.
|
|
* @param {string} id - identifier to use as the element id
|
|
* @param {string} css - css to add to the document
|
|
*/
|
|
|
|
|
|
static addStyle(id, css) {
|
|
document.head.append(DOMTools.createElement(`<style id="${id}">${css}</style>`));
|
|
}
|
|
/**
|
|
* Removes a style from the document.
|
|
* @param {string} id - original identifier used
|
|
*/
|
|
|
|
|
|
static removeStyle(id) {
|
|
const element = document.getElementById(id);
|
|
if (element) element.remove();
|
|
}
|
|
/**
|
|
* Adds/requires a remote script to be loaded
|
|
* @param {string} id - identifier to use for this script
|
|
* @param {string} url - url from which to load the script
|
|
* @returns {Promise} promise that resolves when the script is loaded
|
|
*/
|
|
|
|
|
|
static addScript(id, url) {
|
|
return new Promise(resolve => {
|
|
const script = document.createElement("script");
|
|
script.id = id;
|
|
script.src = url;
|
|
script.type = "text/javascript";
|
|
script.onload = resolve;
|
|
document.head.append(script);
|
|
});
|
|
}
|
|
/**
|
|
* Removes a remote script from the document.
|
|
* @param {string} id - original identifier used
|
|
*/
|
|
|
|
|
|
static removeScript(id) {
|
|
id = this.escapeID(id);
|
|
const element = document.getElementById(id);
|
|
if (element) element.remove();
|
|
} // https://javascript.info/js-animation
|
|
|
|
|
|
static animate({
|
|
timing = _ => _,
|
|
update,
|
|
duration
|
|
}) {
|
|
const start = performance.now();
|
|
requestAnimationFrame(function animate(time) {
|
|
// timeFraction goes from 0 to 1
|
|
let timeFraction = (time - start) / duration;
|
|
if (timeFraction > 1) timeFraction = 1; // calculate the current animation state
|
|
|
|
const progress = timing(timeFraction);
|
|
update(progress); // draw it
|
|
|
|
if (timeFraction < 1) {
|
|
requestAnimationFrame(animate);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* This is my shit version of not having to use `$` from jQuery. Meaning
|
|
* that you can pass a selector and it will automatically run {@link module:DOMTools.query}.
|
|
* It also means that you can pass a string of html and it will perform and return `parseHTML`.
|
|
* @see module:DOMTools.parseHTML
|
|
* @see module:DOMTools.query
|
|
* @param {string} selector - Selector to query or HTML to parse
|
|
* @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query`
|
|
*/
|
|
|
|
|
|
static Q(selector) {
|
|
const element = this.parseHTML(selector);
|
|
const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1;
|
|
if (isHTML) return element;
|
|
return this.query(selector);
|
|
}
|
|
/**
|
|
* Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided
|
|
* `document` is used by default.
|
|
* @param {string} selector - Selector to query
|
|
* @param {Element} [baseElement] - Element to base the query from
|
|
* @returns {(Element|null)} - The found element or null if not found
|
|
*/
|
|
|
|
|
|
static query(selector, baseElement) {
|
|
if (!baseElement) baseElement = document;
|
|
return baseElement.querySelector(selector);
|
|
}
|
|
/**
|
|
* Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided
|
|
* `document` is used by default.
|
|
* @param {string} selector - Selector to query
|
|
* @param {Element} [baseElement] - Element to base the query from
|
|
* @returns {Array<Element>} - Array of all found elements
|
|
*/
|
|
|
|
|
|
static queryAll(selector, baseElement) {
|
|
if (!baseElement) baseElement = document;
|
|
return baseElement.querySelectorAll(selector);
|
|
}
|
|
/**
|
|
* Parses a string of HTML and returns the results. If the second parameter is true,
|
|
* the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.
|
|
* This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.
|
|
*
|
|
* If the second parameter is false, then the return value will be the list of parsed
|
|
* nodes and there were multiple top level nodes, otherwise the single node is returned.
|
|
* @param {string} html - HTML to be parsed
|
|
* @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`
|
|
* @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing
|
|
*/
|
|
|
|
|
|
static parseHTML(html, fragment = false) {
|
|
const template = document.createElement("template");
|
|
template.innerHTML = html;
|
|
const node = template.content.cloneNode(true);
|
|
if (fragment) return node;
|
|
return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];
|
|
}
|
|
/** Alternate name for {@link module:DOMTools.parseHTML} */
|
|
|
|
|
|
static createElement(html, fragment = false) {
|
|
return this.parseHTML(html, fragment);
|
|
}
|
|
/**
|
|
* Takes a string of html and escapes it using the brower's own escaping mechanism.
|
|
* @param {String} html - html to be escaped
|
|
*/
|
|
|
|
|
|
static escapeHTML(html) {
|
|
const textNode = document.createTextNode("");
|
|
const spanElement = document.createElement("span");
|
|
spanElement.append(textNode);
|
|
textNode.nodeValue = html;
|
|
return spanElement.innerHTML;
|
|
}
|
|
/**
|
|
* Adds a list of classes from the target element.
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {...string} classes - Names of classes to add
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static addClass(element, ...classes) {
|
|
classes = classes.flat().filter(c => c);
|
|
|
|
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
|
|
|
|
classes = classes.flat().filter(c => c);
|
|
element.classList.add(...classes);
|
|
return element;
|
|
}
|
|
/**
|
|
* Removes a list of classes from the target element.
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {...string} classes - Names of classes to remove
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static removeClass(element, ...classes) {
|
|
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
|
|
|
|
classes = classes.flat().filter(c => c);
|
|
element.classList.remove(...classes);
|
|
return element;
|
|
}
|
|
/**
|
|
* When only one argument is present: Toggle class value;
|
|
* i.e., if class exists then remove it and return false, if not, then add it and return true.
|
|
* When a second argument is present:
|
|
* If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {string} classname - Name of class to toggle
|
|
* @param {boolean} [indicator] - Optional indicator for if the class should be toggled
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static toggleClass(element, classname, indicator) {
|
|
classname = classname.toString().split(" ").filter(c => c);
|
|
if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c));
|
|
return element;
|
|
}
|
|
/**
|
|
* Checks if an element has a specific class
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {string} classname - Name of class to check
|
|
* @returns {boolean} - `true` if the element has the class, `false` otherwise.
|
|
*/
|
|
|
|
|
|
static hasClass(element, classname) {
|
|
return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c));
|
|
}
|
|
/**
|
|
* Replaces one class with another
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {string} oldName - Name of class to replace
|
|
* @param {string} newName - New name for the class
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static replaceClass(element, oldName, newName) {
|
|
element.classList.replace(oldName, newName);
|
|
return element;
|
|
}
|
|
/**
|
|
* Appends `thisNode` to `thatNode`
|
|
* @param {Node} thisNode - Node to be appended to another node
|
|
* @param {Node} thatNode - Node for `thisNode` to be appended to
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static appendTo(thisNode, thatNode) {
|
|
if (typeof thatNode == "string") thatNode = this.query(thatNode);
|
|
if (!thatNode) return null;
|
|
thatNode.append(thisNode);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Prepends `thisNode` to `thatNode`
|
|
* @param {Node} thisNode - Node to be prepended to another node
|
|
* @param {Node} thatNode - Node for `thisNode` to be prepended to
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static prependTo(thisNode, thatNode) {
|
|
if (typeof thatNode == "string") thatNode = this.query(thatNode);
|
|
if (!thatNode) return null;
|
|
thatNode.prepend(thisNode);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.
|
|
* @param {Node} thisNode - The node to insert
|
|
* @param {Node} targetNode - Node to insert after in the tree
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static insertAfter(thisNode, targetNode) {
|
|
targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.
|
|
* @param {Node} thisNode - The node to insert
|
|
* @param {Node} newNode - Node to insert after in the tree
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static after(thisNode, newNode) {
|
|
thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Gets the next sibling element that matches the selector.
|
|
* @param {Element} element - Element to get the next sibling of
|
|
* @param {string} [selector=""] - Optional selector
|
|
* @returns {Element} - The sibling element
|
|
*/
|
|
|
|
|
|
static next(element, selector = "") {
|
|
return selector ? element.querySelector("+ " + selector) : element.nextElementSibling;
|
|
}
|
|
/**
|
|
* Gets all subsequent siblings.
|
|
* @param {Element} element - Element to get next siblings of
|
|
* @returns {NodeList} - The list of siblings
|
|
*/
|
|
|
|
|
|
static nextAll(element) {
|
|
return element.querySelectorAll("~ *");
|
|
}
|
|
/**
|
|
* Gets the subsequent siblings until an element matches the selector.
|
|
* @param {Element} element - Element to get the following siblings of
|
|
* @param {string} selector - Selector to stop at
|
|
* @returns {Array<Element>} - The list of siblings
|
|
*/
|
|
|
|
|
|
static nextUntil(element, selector) {
|
|
const next = [];
|
|
|
|
while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling);
|
|
|
|
return next;
|
|
}
|
|
/**
|
|
* Gets the previous sibling element that matches the selector.
|
|
* @param {Element} element - Element to get the previous sibling of
|
|
* @param {string} [selector=""] - Optional selector
|
|
* @returns {Element} - The sibling element
|
|
*/
|
|
|
|
|
|
static previous(element, selector = "") {
|
|
const previous = element.previousElementSibling;
|
|
if (selector) return previous && previous.matches(selector) ? previous : null;
|
|
return previous;
|
|
}
|
|
/**
|
|
* Gets all preceeding siblings.
|
|
* @param {Element} element - Element to get preceeding siblings of
|
|
* @returns {NodeList} - The list of siblings
|
|
*/
|
|
|
|
|
|
static previousAll(element) {
|
|
const previous = [];
|
|
|
|
while (element.previousElementSibling) previous.push(element = element.previousElementSibling);
|
|
|
|
return previous;
|
|
}
|
|
/**
|
|
* Gets the preceeding siblings until an element matches the selector.
|
|
* @param {Element} element - Element to get the preceeding siblings of
|
|
* @param {string} selector - Selector to stop at
|
|
* @returns {Array<Element>} - The list of siblings
|
|
*/
|
|
|
|
|
|
static previousUntil(element, selector) {
|
|
const previous = [];
|
|
|
|
while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling);
|
|
|
|
return previous;
|
|
}
|
|
/**
|
|
* Find which index in children a certain node is. Similar to jQuery's `$.index()`
|
|
* @param {HTMLElement} node - The node to find its index in parent
|
|
* @returns {number} Index of the node
|
|
*/
|
|
|
|
|
|
static indexInParent(node) {
|
|
const children = node.parentNode.childNodes;
|
|
let num = 0;
|
|
|
|
for (let i = 0; i < children.length; i++) {
|
|
if (children[i] == node) return num;
|
|
if (children[i].nodeType == 1) num++;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
/** Shorthand for {@link module:DOMTools.indexInParent} */
|
|
|
|
|
|
static index(node) {
|
|
return this.indexInParent(node);
|
|
}
|
|
/**
|
|
* Gets the parent of the element if it matches the selector,
|
|
* otherwise returns null.
|
|
* @param {Element} element - Element to get parent of
|
|
* @param {string} [selector=""] - Selector to match parent
|
|
* @returns {(Element|null)} - The sibling element or null
|
|
*/
|
|
|
|
|
|
static parent(element, selector = "") {
|
|
return !selector || element.parentElement.matches(selector) ? element.parentElement : null;
|
|
}
|
|
/**
|
|
* Gets all children of Element that match the selector if provided.
|
|
* @param {Element} element - Element to get all children of
|
|
* @param {string} selector - Selector to match the children to
|
|
* @returns {Array<Element>} - The list of children
|
|
*/
|
|
|
|
|
|
static findChild(element, selector) {
|
|
return element.querySelector(":scope > " + selector);
|
|
}
|
|
/**
|
|
* Gets all children of Element that match the selector if provided.
|
|
* @param {Element} element - Element to get all children of
|
|
* @param {string} selector - Selector to match the children to
|
|
* @returns {Array<Element>} - The list of children
|
|
*/
|
|
|
|
|
|
static findChildren(element, selector) {
|
|
return element.querySelectorAll(":scope > " + selector);
|
|
}
|
|
/**
|
|
* Gets all ancestors of Element that match the selector if provided.
|
|
* @param {Element} element - Element to get all parents of
|
|
* @param {string} [selector=""] - Selector to match the parents to
|
|
* @returns {Array<Element>} - The list of parents
|
|
*/
|
|
|
|
|
|
static parents(element, selector = "") {
|
|
const parents = [];
|
|
if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));else while (element.parentElement) parents.push(element = element.parentElement);
|
|
return parents;
|
|
}
|
|
/**
|
|
* Gets the ancestors until an element matches the selector.
|
|
* @param {Element} element - Element to get the ancestors of
|
|
* @param {string} selector - Selector to stop at
|
|
* @returns {Array<Element>} - The list of parents
|
|
*/
|
|
|
|
|
|
static parentsUntil(element, selector) {
|
|
const parents = [];
|
|
|
|
while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement);
|
|
|
|
return parents;
|
|
}
|
|
/**
|
|
* Gets all siblings of the element that match the selector.
|
|
* @param {Element} element - Element to get all siblings of
|
|
* @param {string} [selector="*"] - Selector to match the siblings to
|
|
* @returns {Array<Element>} - The list of siblings
|
|
*/
|
|
|
|
|
|
static siblings(element, selector = "*") {
|
|
return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector));
|
|
}
|
|
/**
|
|
* Sets or gets css styles for a specific element. If `value` is provided
|
|
* then it sets the style and returns the element to allow for chaining,
|
|
* otherwise returns the style.
|
|
* @param {Element} element - Element to set the CSS of
|
|
* @param {string} attribute - Attribute to get or set
|
|
* @param {string} [value] - Value to set for attribute
|
|
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
|
|
*/
|
|
|
|
|
|
static css(element, attribute, value) {
|
|
if (typeof value == "undefined") return global.getComputedStyle(element)[attribute];
|
|
element.style[attribute] = value;
|
|
return element;
|
|
}
|
|
/**
|
|
* Sets or gets the width for a specific element. If `value` is provided
|
|
* then it sets the width and returns the element to allow for chaining,
|
|
* otherwise returns the width.
|
|
* @param {Element} element - Element to set the CSS of
|
|
* @param {string} [value] - Width to set
|
|
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
|
|
*/
|
|
|
|
|
|
static width(element, value) {
|
|
if (typeof value == "undefined") return parseInt(getComputedStyle(element).width);
|
|
element.style.width = value;
|
|
return element;
|
|
}
|
|
/**
|
|
* Sets or gets the height for a specific element. If `value` is provided
|
|
* then it sets the height and returns the element to allow for chaining,
|
|
* otherwise returns the height.
|
|
* @param {Element} element - Element to set the CSS of
|
|
* @param {string} [value] - Height to set
|
|
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
|
|
*/
|
|
|
|
|
|
static height(element, value) {
|
|
if (typeof value == "undefined") return parseInt(getComputedStyle(element).height);
|
|
element.style.height = value;
|
|
return element;
|
|
}
|
|
/**
|
|
* Sets the inner text of an element if given a value, otherwise returns it.
|
|
* @param {Element} element - Element to set the text of
|
|
* @param {string} [text] - Content to set
|
|
* @returns {string} - Either the string set by this call or the current text content of the node.
|
|
*/
|
|
|
|
|
|
static text(element, text) {
|
|
if (typeof text == "undefined") return element.textContent;
|
|
return element.textContent = text;
|
|
}
|
|
/**
|
|
* Returns the innerWidth of the element.
|
|
* @param {Element} element - Element to retrieve inner width of
|
|
* @return {number} - The inner width of the element.
|
|
*/
|
|
|
|
|
|
static innerWidth(element) {
|
|
return element.clientWidth;
|
|
}
|
|
/**
|
|
* Returns the innerHeight of the element.
|
|
* @param {Element} element - Element to retrieve inner height of
|
|
* @return {number} - The inner height of the element.
|
|
*/
|
|
|
|
|
|
static innerHeight(element) {
|
|
return element.clientHeight;
|
|
}
|
|
/**
|
|
* Returns the outerWidth of the element.
|
|
* @param {Element} element - Element to retrieve outer width of
|
|
* @return {number} - The outer width of the element.
|
|
*/
|
|
|
|
|
|
static outerWidth(element) {
|
|
return element.offsetWidth;
|
|
}
|
|
/**
|
|
* Returns the outerHeight of the element.
|
|
* @param {Element} element - Element to retrieve outer height of
|
|
* @return {number} - The outer height of the element.
|
|
*/
|
|
|
|
|
|
static outerHeight(element) {
|
|
return element.offsetHeight;
|
|
}
|
|
/**
|
|
* Gets the offset of the element in the page.
|
|
* @param {Element} element - Element to get offset of
|
|
* @return {Offset} - The offset of the element
|
|
*/
|
|
|
|
|
|
static offset(element) {
|
|
return element.getBoundingClientRect();
|
|
}
|
|
|
|
static get listeners() {
|
|
return this._listeners || (this._listeners = {});
|
|
}
|
|
/**
|
|
* This is similar to jQuery's `on` function and can *hopefully* be used in the same way.
|
|
*
|
|
* Rather than attempt to explain, I'll show some example usages.
|
|
*
|
|
* The following will add a click listener (in the `myPlugin` namespace) to `element`.
|
|
* `DOMTools.on(element, "click.myPlugin", () => {console.log("clicked!");});`
|
|
*
|
|
* The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element.
|
|
* `DOMTools.on(element, "click.myPlugin", ".block", () => {console.log("clicked!");});`
|
|
*
|
|
* The following will add a click listener (without namespace) to `element`.
|
|
* `DOMTools.on(element, "click", () => {console.log("clicked!");});`
|
|
*
|
|
* The following will add a click listener (without namespace) to `element` that only fires once.
|
|
* `const cancel = DOMTools.on(element, "click", () => {console.log("fired!"); cancel();});`
|
|
*
|
|
* @param {Element} element - Element to add listener to
|
|
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
|
|
* @param {(string|callable)} delegate - Selector to run on element to listen to
|
|
* @param {callable} [callback] - Function to fire on event
|
|
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
|
|
*/
|
|
|
|
|
|
static on(element, event, delegate, callback) {
|
|
const [type, namespace] = event.split(".");
|
|
const hasDelegate = delegate && callback;
|
|
if (!callback) callback = delegate;
|
|
const eventFunc = !hasDelegate ? callback : function (event) {
|
|
if (event.target.matches(delegate)) {
|
|
callback(event);
|
|
}
|
|
};
|
|
element.addEventListener(type, eventFunc);
|
|
|
|
const cancel = () => {
|
|
element.removeEventListener(type, eventFunc);
|
|
};
|
|
|
|
if (namespace) {
|
|
if (!this.listeners[namespace]) this.listeners[namespace] = [];
|
|
|
|
const newCancel = () => {
|
|
cancel();
|
|
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
|
|
};
|
|
|
|
this.listeners[namespace].push({
|
|
event: type,
|
|
element: element,
|
|
cancel: newCancel
|
|
});
|
|
return newCancel;
|
|
}
|
|
|
|
return cancel;
|
|
}
|
|
/**
|
|
* Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself
|
|
* and removes the listener upon the first firing of the desired event.
|
|
*
|
|
* @param {Element} element - Element to add listener to
|
|
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
|
|
* @param {(string|callable)} delegate - Selector to run on element to listen to
|
|
* @param {callable} [callback] - Function to fire on event
|
|
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
|
|
*/
|
|
|
|
|
|
static once(element, event, delegate, callback) {
|
|
const [type, namespace] = event.split(".");
|
|
const hasDelegate = delegate && callback;
|
|
if (!callback) callback = delegate;
|
|
const eventFunc = !hasDelegate ? function (event) {
|
|
callback(event);
|
|
element.removeEventListener(type, eventFunc);
|
|
} : function (event) {
|
|
if (!event.target.matches(delegate)) return;
|
|
callback(event);
|
|
element.removeEventListener(type, eventFunc);
|
|
};
|
|
element.addEventListener(type, eventFunc);
|
|
|
|
const cancel = () => {
|
|
element.removeEventListener(type, eventFunc);
|
|
};
|
|
|
|
if (namespace) {
|
|
if (!this.listeners[namespace]) this.listeners[namespace] = [];
|
|
|
|
const newCancel = () => {
|
|
cancel();
|
|
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
|
|
};
|
|
|
|
this.listeners[namespace].push({
|
|
event: type,
|
|
element: element,
|
|
cancel: newCancel
|
|
});
|
|
return newCancel;
|
|
}
|
|
|
|
return cancel;
|
|
}
|
|
|
|
static __offAll(event, element) {
|
|
const [type, namespace] = event.split(".");
|
|
|
|
let matchFilter = listener => listener.event == type,
|
|
defaultFilter = _ => _;
|
|
|
|
if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element;
|
|
const listeners = this.listeners[namespace] || [];
|
|
const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter);
|
|
|
|
for (let c = 0; c < list.length; c++) list[c].cancel();
|
|
}
|
|
/**
|
|
* This is similar to jQuery's `off` function and can *hopefully* be used in the same way.
|
|
*
|
|
* Rather than attempt to explain, I'll show some example usages.
|
|
*
|
|
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`.
|
|
* `DOMTools.off(element, "click.myPlugin", onClick);`
|
|
*
|
|
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element.
|
|
* `DOMTools.off(element, "click.myPlugin", ".block", onClick);`
|
|
*
|
|
* The following will remove a click listener (without namespace) from `element`.
|
|
* `DOMTools.off(element, "click", onClick);`
|
|
*
|
|
* The following will remove all listeners in namespace `myPlugin` from `element`.
|
|
* `DOMTools.off(element, ".myPlugin");`
|
|
*
|
|
* The following will remove all click listeners in namespace `myPlugin` from *all elements*.
|
|
* `DOMTools.off("click.myPlugin");`
|
|
*
|
|
* The following will remove all listeners in namespace `myPlugin` from *all elements*.
|
|
* `DOMTools.off(".myPlugin");`
|
|
*
|
|
* @param {(Element|string)} element - Element to remove listener from
|
|
* @param {string} [event] - Event to listen to with option namespace (e.g. "event.namespace")
|
|
* @param {(string|callable)} [delegate] - Selector to run on element to listen to
|
|
* @param {callable} [callback] - Function to fire on event
|
|
* @returns {Element} - The original element to allow for chaining
|
|
*/
|
|
|
|
|
|
static off(element, event, delegate, callback) {
|
|
if (typeof element == "string") return this.__offAll(element);
|
|
const [type, namespace] = event.split(".");
|
|
if (namespace) return this.__offAll(event, element);
|
|
const hasDelegate = delegate && callback;
|
|
if (!callback) callback = delegate;
|
|
const eventFunc = !hasDelegate ? callback : function (event) {
|
|
if (event.target.matches(delegate)) {
|
|
callback(event);
|
|
}
|
|
};
|
|
element.removeEventListener(type, eventFunc);
|
|
return element;
|
|
}
|
|
/**
|
|
* Adds a listener for when the node is added/removed from the document body.
|
|
* The listener is automatically removed upon firing.
|
|
* @param {HTMLElement} node - node to wait for
|
|
* @param {callable} callback - function to be performed on event
|
|
* @param {boolean} onMount - determines if it should fire on Mount or on Unmount
|
|
*/
|
|
|
|
|
|
static onMountChange(node, callback, onMount = true) {
|
|
const wrappedCallback = () => {
|
|
this.observer.unsubscribe(wrappedCallback);
|
|
callback();
|
|
};
|
|
|
|
this.observer.subscribe(wrappedCallback, mutation => {
|
|
const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes);
|
|
const directMatch = nodes.indexOf(node) > -1;
|
|
const parentMatch = nodes.some(parent => parent.contains(node));
|
|
return directMatch || parentMatch;
|
|
});
|
|
return node;
|
|
}
|
|
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */
|
|
|
|
|
|
static onMount(node, callback) {
|
|
return this.onMountChange(node, callback);
|
|
}
|
|
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */
|
|
|
|
|
|
static onUnmount(node, callback) {
|
|
return this.onMountChange(node, callback, false);
|
|
}
|
|
/** Alias for {@link module:DOMTools.onMount} */
|
|
|
|
|
|
static onAdded(node, callback) {
|
|
return this.onMount(node, callback);
|
|
}
|
|
/** Alias for {@link module:DOMTools.onUnmount} */
|
|
|
|
|
|
static onRemoved(node, callback) {
|
|
return this.onUnmount(node, callback, false);
|
|
}
|
|
/**
|
|
* Helper function which combines multiple elements into one parent element
|
|
* @param {Array<HTMLElement>} elements - array of elements to put into a single parent
|
|
*/
|
|
|
|
|
|
static wrap(elements) {
|
|
const domWrapper = this.parseHTML(`<div class="dom-wrapper"></div>`);
|
|
|
|
for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);
|
|
|
|
return domWrapper;
|
|
}
|
|
/**
|
|
* Resolves the node to an HTMLElement. This is mainly used by library modules.
|
|
* @param {(jQuery|Element)} node - node to resolve
|
|
*/
|
|
|
|
|
|
static resolveElement(node) {
|
|
if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;
|
|
return node instanceof jQuery ? node[0] : node;
|
|
}
|
|
|
|
}
|
|
window.Lightcord.BetterDiscord.DOM = DOMTools;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/emojiModule.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/emojiModule.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
//import DiscordCrypt from "./DiscordCrypt";
|
|
|
|
const Constants = {
|
|
EmojiRegex: /<a?\.(\w+)\.(\d+)>/g
|
|
};
|
|
let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
|
|
let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
|
|
let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0];
|
|
let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0];
|
|
let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0];
|
|
let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0];
|
|
let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0];
|
|
let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext);
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule {
|
|
constructor() {
|
|
this.init();
|
|
}
|
|
|
|
async init() {
|
|
/** Emoji AutoComplete */
|
|
if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete");
|
|
if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions);
|
|
if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults);
|
|
if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING);
|
|
if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching);
|
|
if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext);
|
|
|
|
if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) {
|
|
console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates);
|
|
const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions;
|
|
|
|
AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) {
|
|
const value = getAutocompleteOptions.call(this, ...arguments);
|
|
value.LIGHTCORD_EMOJIS = {
|
|
matches(arg1, arg2) {
|
|
let condition = arg2.length > 1 && "." === arg1;
|
|
setEmojiUsable(condition);
|
|
return condition;
|
|
},
|
|
|
|
queryResults(t) {
|
|
let results = EmojiModuleQuery.default.queryEmojiResults(t, e);
|
|
return results;
|
|
},
|
|
|
|
renderResults(e, t, n, r, a) {
|
|
return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) {
|
|
return {
|
|
emoji: e,
|
|
key: e.id || e.uniqueName || e.name,
|
|
sentinel: ".",
|
|
guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null
|
|
};
|
|
}, function (e) {
|
|
return "." + e + ".";
|
|
});
|
|
},
|
|
|
|
getPlainText(id, guild) {
|
|
var emojis = guild.emojis;
|
|
if (null == emojis || null == emojis[id]) return "";
|
|
var emoji = emojis[id],
|
|
isAnimated = emoji.animated ? "a" : "";
|
|
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
|
|
},
|
|
|
|
getRawText(id, guild) {
|
|
var emojis = guild.emojis;
|
|
if (null == emojis || null == emojis[id]) return "";
|
|
var emoji = emojis[id],
|
|
isAnimated = emoji.animated ? "a" : "";
|
|
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
|
|
}
|
|
|
|
};
|
|
return value;
|
|
};
|
|
} else {
|
|
console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));
|
|
}
|
|
/** Emoji display */
|
|
|
|
|
|
while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
if (!this.cancelEmojiRender) {
|
|
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
|
|
before: data => {
|
|
const message = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
|
|
if (!message) return;
|
|
const content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
|
|
if (!content || !content.length) return; // content = DiscordCrypt.decryptContent(content)
|
|
|
|
/**
|
|
* @type {{
|
|
* raw: string,
|
|
* name: string,
|
|
* id: string,
|
|
* animated: boolean
|
|
* }[]}
|
|
*/
|
|
|
|
let emojis = [];
|
|
const newContent = [];
|
|
|
|
for (let node of content) {
|
|
if (typeof node !== "string") {
|
|
newContent.push(node);
|
|
continue;
|
|
}
|
|
|
|
;
|
|
let parsed;
|
|
let hasParsed = false;
|
|
|
|
do {
|
|
parsed = Constants.EmojiRegex.exec(node);
|
|
|
|
if (parsed) {
|
|
hasParsed = true;
|
|
if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
|
|
const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]);
|
|
|
|
if (emoji) {
|
|
emojis.push({
|
|
animated: emoji.animated,
|
|
name: emoji.name,
|
|
id: emoji.id,
|
|
raw: parsed[0]
|
|
});
|
|
} else {
|
|
emojis.push({
|
|
animated: parsed[0].startsWith("<a"),
|
|
name: parsed[1],
|
|
id: parsed[2],
|
|
raw: parsed[0]
|
|
});
|
|
}
|
|
}
|
|
} while (parsed);
|
|
|
|
if (hasParsed) {
|
|
const words = node.split(" ").map((word, index, arr) => {
|
|
if (!word) return "";
|
|
const emoji = emojis.find(e => e.raw == word);
|
|
if (!emoji) return word;
|
|
if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
|
|
return React.createElement(CustomEmojiModule.CustomEmoji, {
|
|
emoji: {
|
|
name: `.${emoji.name}.`,
|
|
emojiId: emoji.id,
|
|
animated: emoji.animated,
|
|
jumboable: arr.length === 1 && content.length === 1
|
|
}
|
|
});
|
|
}).reduce((previous, current) => {
|
|
if (previous.length === 0) return [current];
|
|
|
|
if (typeof current === "string") {
|
|
if (typeof previous[previous.length - 1] === "string") {
|
|
previous[previous.length - 1] += ` ${current}`;
|
|
return previous;
|
|
}
|
|
|
|
previous.push(" " + current);
|
|
return previous;
|
|
}
|
|
|
|
previous.push(" ", current);
|
|
return previous;
|
|
}, []);
|
|
newContent.push(...words);
|
|
} else {
|
|
newContent.push(node);
|
|
}
|
|
}
|
|
|
|
while (data.methodArguments[0].childrenMessageContent.props.content[0]) {
|
|
data.methodArguments[0].childrenMessageContent.props.content.shift();
|
|
}
|
|
|
|
while (newContent[0]) {
|
|
data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift());
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
disable() {
|
|
if (!this.cancelEmoteRender) return;
|
|
this.cancelEmoteRender();
|
|
this.cancelEmoteRender = null;
|
|
}
|
|
|
|
start() {}
|
|
|
|
}());
|
|
|
|
function D(e, t, n, r, o, i, s, u, l, c) {
|
|
if (null == n || 0 === n.length) return null;
|
|
var d = n.map(function (e, n) {
|
|
return React.createElement(u, Object.assign({
|
|
onClick: o,
|
|
onHover: r,
|
|
selected: t === n,
|
|
index: n
|
|
}, l(e, n)));
|
|
});
|
|
return [R(i, s, e, c), d];
|
|
}
|
|
|
|
function R(e, t, n, r) {
|
|
var a = n.length > 0 ? e.format({
|
|
prefix: r(n)
|
|
}) : t;
|
|
|
|
if (Array.isArray(a)) {
|
|
a.unshift(React.createElement("strong", {}, "[Lightcord] "));
|
|
} else {
|
|
a = "[LIGHTCORD] " + a;
|
|
}
|
|
|
|
return React.createElement(AutocompleteModule.default.Title, {
|
|
title: a
|
|
}, a);
|
|
}
|
|
|
|
R.displayName = "renderHeader";
|
|
let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
|
|
let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled;
|
|
let isUsable = false;
|
|
let hasPatched = false;
|
|
|
|
function setEmojiUsable(usable) {
|
|
isUsable = usable;
|
|
if (hasPatched) return;
|
|
if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
|
|
if (!EmojiFilterModule) return;
|
|
if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled;
|
|
hasPatched = true;
|
|
|
|
EmojiFilterModule.default.isEmojiDisabled = function (emoji) {
|
|
if (isUsable) {
|
|
if (emoji.surrogates || emoji.diversity) return true;
|
|
return false;
|
|
}
|
|
|
|
return isEmojiDisabled.call(this, ...arguments);
|
|
};
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/pluginCertifier.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/modules/pluginCertifier.js ***!
|
|
\****************************************/
|
|
/*! exports provided: default, checkViruses, checkHash, processFile, processAttachment */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkViruses", function() { return checkViruses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkHash", function() { return checkHash; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processFile", function() { return processFile; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processAttachment", function() { return processAttachment; });
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ "node-fetch");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ "crypto");
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const cache = {};
|
|
const cache2 = {};
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
|
|
constructor() {}
|
|
|
|
patch(attachment, id) {
|
|
process.nextTick(() => {
|
|
processAttachment(attachment, id);
|
|
});
|
|
}
|
|
|
|
start() {}
|
|
|
|
isTrusted(hash) {
|
|
return cache[hash] && !cache[hash].suspect;
|
|
}
|
|
|
|
}());
|
|
function checkViruses(hash, data, resultCallback, removeCallback) {
|
|
data = data.toString("utf8").split(/[^\w\d]+/g);
|
|
let isHarmful = false;
|
|
|
|
for (let keyword of data) {
|
|
for (let oof of ["token", "email", "phone", "MFA", "2fa", "process", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) {
|
|
if (keyword.toLowerCase().includes(oof.toLowerCase())) {
|
|
isHarmful = "token stealer/virus";
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (isHarmful) break;
|
|
}
|
|
|
|
if (!isHarmful) {
|
|
/**
|
|
* @type {string}
|
|
*/
|
|
const no_comments = data.replace(/\/\*[\s\S]*?\*\/|([^\\:]|^)\/\/.*$/gm, "").trim(); // removing the META comment from plugins
|
|
|
|
if (/var [\w\d_$]+=\["/gi.test(no_comments)) {
|
|
isHarmful = "obfuscation/hidden code";
|
|
}
|
|
|
|
if (!isHarmful) {
|
|
const regexps = [
|
|
/** hexadecimal */
|
|
/_0x\w{4}\('0x[\dabcdef]+'\)/g, /_0x\w{4}\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g, // _0x8db7('0x0', 'x1]f')
|
|
|
|
/** mangled */
|
|
/\w+\('0x[\dabcdef]+'\)/g, // b('0x0')
|
|
/\w+\('0x[\dabcdef]+'[, ]+'[^']{4}'\)/g // b('0x0', 'x1]f')
|
|
];
|
|
|
|
for (let regex of regexps) {
|
|
if (isHarmful) break;
|
|
isHarmful = regex.test(no_comments) ? "obfuscation/hidden code" : false;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!isHarmful) return removeCallback();
|
|
cache[hash] = {
|
|
suspect: true,
|
|
name: hashToUrl[hash].split("/").pop(),
|
|
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
|
|
harm: isHarmful
|
|
};
|
|
console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`);
|
|
resultCallback(cache[hash]);
|
|
}
|
|
const hashToUrl = {};
|
|
function checkHash(hash, data, filename, resultCallback, removeCallback) {
|
|
console.log(`File: ${filename} hash: ${hash}`);
|
|
|
|
if (!cache[hash]) {
|
|
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/" + hash, {
|
|
// Using node-fetch to bypass cors
|
|
headers: {
|
|
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent // have to set user-agent
|
|
|
|
}
|
|
}).then(async res => {
|
|
if (res.status !== 200) {
|
|
if (filename.endsWith(".theme.css")) return removeCallback();
|
|
return checkViruses(hash, data, resultCallback, wrongCallback);
|
|
}
|
|
|
|
const result = await res.json();
|
|
cache[hash] = result;
|
|
resultCallback(result);
|
|
}).catch(() => {});
|
|
} else {
|
|
const result = cache[hash];
|
|
resultCallback(result);
|
|
}
|
|
}
|
|
function processFile(__path, resultCallback, removeCallback) {
|
|
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
|
|
let data = Buffer.alloc(0);
|
|
Object(fs__WEBPACK_IMPORTED_MODULE_6__["createReadStream"])(__path).on("data", chunk => {
|
|
data = Buffer.concat([data, chunk]);
|
|
hash.update(chunk);
|
|
}).on("end", () => {
|
|
const hashResult = hash.digest("hex");
|
|
hashToUrl[hashResult] = __path;
|
|
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);
|
|
}, () => {
|
|
document.getElementById(id).remove();
|
|
});
|
|
});
|
|
}).catch(() => {});
|
|
}
|
|
let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
|
|
let childModule = BDModules.get(e => e.childContainer)[0];
|
|
/**
|
|
*
|
|
* @param {HTMLDivElement[]} elements
|
|
* @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result
|
|
*/
|
|
|
|
function renderToElements(id, result, filename) {
|
|
const div = document.getElementById(id);
|
|
if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore.
|
|
|
|
if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
|
|
if (!childModule) childModule = BDModules.get(e => e.childContainer)[0];
|
|
console.log(result);
|
|
|
|
if (result.suspect) {
|
|
try {
|
|
div.parentNode.style.borderColor = "rgb(240, 71, 71)";
|
|
/**
|
|
*
|
|
* @param {HTMLElement} node
|
|
*/
|
|
|
|
let nextNode = node => {
|
|
for (let child of node.children) {
|
|
if (child.tagName === "A") {
|
|
child.addEventListener("click", e => {
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", {
|
|
confirmText: "Download Anyway",
|
|
cancelText: "Don't !",
|
|
danger: true,
|
|
onCancel: () => {},
|
|
onConfirm: () => {
|
|
electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href);
|
|
}
|
|
});
|
|
});
|
|
} else if (["div"].includes(child.tagName.toLowerCase())) {
|
|
nextNode(child);
|
|
}
|
|
}
|
|
};
|
|
|
|
nextNode(div.parentNode);
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: result.type + " " + result.name + " is potentially dangerous."
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "16px",
|
|
height: "16px"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: BDModules.get(e => e.svg)[0].svg,
|
|
"aria-hidden": "false",
|
|
width: "16px",
|
|
height: "16px",
|
|
viewBox: "0 0 40 32"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "32",
|
|
height: "32",
|
|
mask: "url(#svg-mask-avatar-status-round-32)",
|
|
fill: "#f04747",
|
|
mask: "url(#svg-mask-status-dnd)",
|
|
className: BDModules.get(e => e.pointerEvents)[0].pointerEvents
|
|
})))), div);
|
|
} else if (!result.official) {
|
|
div.parentNode.style.borderColor = "#4087ed";
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: result.type + " " + result.name + " is certified by Lightcord."
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "16px",
|
|
height: "16px"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: flowerStarModule.flowerStar,
|
|
"aria-hidden": "false",
|
|
width: "16px",
|
|
height: "16px",
|
|
viewBox: "0 0 16 15.2"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "#4f545c",
|
|
"fill-rule": "evenodd",
|
|
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
|
|
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: childModule.childContainer
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
"aria-hidden": "false",
|
|
width: "16px",
|
|
height: "16px",
|
|
viewBox: "0 0 16 15.2"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "#ffffff",
|
|
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"
|
|
}))))), div);
|
|
} else {
|
|
div.parentNode.style.borderColor = "#4087ed";
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: result.type + " " + result.name + " was made by the developers of Lightcord.",
|
|
style: "brand"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "16px",
|
|
height: "16px"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: flowerStarModule.flowerStar,
|
|
"aria-hidden": "false",
|
|
width: "16px",
|
|
height: "16px",
|
|
viewBox: "0 0 16 15.2",
|
|
stroke: "#36393f",
|
|
style: {
|
|
color: "#4087ed"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "currentColor",
|
|
"fill-rule": "evenodd",
|
|
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
|
|
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: childModule.childContainer
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
"aria-hidden": "false",
|
|
width: "16px",
|
|
height: "16px",
|
|
viewBox: "0 0 16 15.2"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "#ffffff",
|
|
d: "M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z"
|
|
}))))), div);
|
|
}
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/pluginModule.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/modules/pluginModule.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PluginModule {
|
|
get folder() {
|
|
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder;
|
|
}
|
|
|
|
}
|
|
|
|
PluginModule.prototype.loadPlugins = async function () {
|
|
this.loadPluginData();
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins()));
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
let plugin, name;
|
|
|
|
try {
|
|
plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
name = plugin.getName();
|
|
if (plugin.load && typeof plugin.load == "function") plugin.load();
|
|
} catch (err) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
|
|
name: name,
|
|
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
|
|
message: "load() could not be fired.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
});
|
|
continue;
|
|
}
|
|
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) {
|
|
try {
|
|
plugin.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);
|
|
} catch (err) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
|
|
name: name,
|
|
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
|
|
message: "start() could not be fired.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
this.savePluginData();
|
|
|
|
__webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin");
|
|
|
|
};
|
|
|
|
PluginModule.prototype.startPlugin = function (plugin, reload = false) {
|
|
try {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`);
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, {
|
|
type: "error"
|
|
});
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
|
|
this.savePluginData();
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.stopPlugin = function (plugin, reload = false) {
|
|
try {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`);
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, {
|
|
type: "error"
|
|
});
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.enablePlugin = function (plugin, reload = false) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true;
|
|
this.savePluginData();
|
|
this.startPlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.enable = function (plugin, reload = false) {
|
|
return this.enablePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.disablePlugin = function (plugin, reload = false) {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
|
|
this.savePluginData();
|
|
this.stopPlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.disable = function (plugin, reload = false) {
|
|
return this.disablePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.togglePlugin = function (plugin) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin);
|
|
};
|
|
|
|
PluginModule.prototype.toggle = function (plugin, reload = false) {
|
|
return this.togglePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.loadPlugin = async function (filename) {
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
|
|
}
|
|
|
|
const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin;
|
|
|
|
try {
|
|
if (plugin.load && typeof plugin.load == "function") plugin.load();
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [err]
|
|
});
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName());
|
|
};
|
|
|
|
PluginModule.prototype.unloadPlugin = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
const plugin = bdplugin.plugin.getName();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true);
|
|
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
|
|
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin];
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin);
|
|
};
|
|
|
|
PluginModule.prototype.delete = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
this.unloadPlugin(bdplugin.filename);
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
|
|
|
|
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
|
|
};
|
|
|
|
PluginModule.prototype.reloadPlugin = async function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return this.loadPlugin(filenameOrName);
|
|
const plugin = bdplugin.plugin.getName();
|
|
const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin];
|
|
if (enabled) this.stopPlugin(plugin, true);
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error);
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load();
|
|
if (enabled) this.startPlugin(plugin, true);
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin);
|
|
};
|
|
|
|
PluginModule.prototype.reload = function (name) {
|
|
return this.reloadPlugin(name);
|
|
};
|
|
|
|
PluginModule.prototype.edit = function (filenameOrName) {
|
|
console.log("Edit " + filenameOrName);
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
|
|
|
|
console.log("Edit " + fullPath);
|
|
|
|
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
|
|
};
|
|
|
|
PluginModule.prototype.updatePluginList = function () {
|
|
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
|
|
|
|
for (const filename of results.added) this.loadPlugin(filename);
|
|
|
|
for (const name of results.removed) this.unloadPlugin(name);
|
|
};
|
|
|
|
PluginModule.prototype.loadPluginData = function () {
|
|
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
|
|
|
|
if (saved) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.savePluginData = function () {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
|
|
};
|
|
|
|
PluginModule.prototype.newMessage = function () {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.onMessage === "function") {
|
|
try {
|
|
plugin.onMessage();
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.channelSwitch = function () {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.onSwitch === "function") {
|
|
try {
|
|
plugin.onSwitch();
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.rawObserver = function (e) {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.observer === "function") {
|
|
try {
|
|
plugin.observer(e);
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/publicServers.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/publicServers.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js");
|
|
/* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
|
|
constructor() {
|
|
this._appendButton = this._appendButton.bind(this);
|
|
}
|
|
|
|
get component() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
rootId: "pubslayerroot",
|
|
id: "pubslayer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
rootId: "pubslayerroot"
|
|
}));
|
|
}
|
|
|
|
get root() {
|
|
const _root = document.getElementById("pubslayerroot");
|
|
|
|
if (!_root) {
|
|
if (!this.injectRoot()) return null;
|
|
return this.root;
|
|
}
|
|
|
|
return _root;
|
|
}
|
|
|
|
injectRoot() {
|
|
let [classNameLayers] = [BDModules.get(e => e.layers && e.layer)[0].layers.split(" ")[0]];
|
|
const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers);
|
|
if (!layers) return false;
|
|
layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("<div id='pubslayerroot'>"));
|
|
return true;
|
|
}
|
|
|
|
render() {
|
|
const root = this.root;
|
|
|
|
if (!root) {
|
|
console.log("FAILED TO LOCATE ROOT: .layers");
|
|
return;
|
|
}
|
|
|
|
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root);
|
|
}
|
|
|
|
get button() {
|
|
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-li" class="${_v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.listItem}">`);
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none";
|
|
const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-button" class="${"wrapper-25eVIn " + _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.circleButtonMask}">public</div>`);
|
|
label.addEventListener("click", () => {
|
|
this.render();
|
|
});
|
|
btn.append(label);
|
|
return btn;
|
|
}
|
|
|
|
_appendButton() {
|
|
let [classNameScroller] = [BDModules.get(e => e.scroller && e.scrollbarWidth)[0].scroller];
|
|
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
|
|
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.wrapper.split(" ")[0];
|
|
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`.${wrapper} .${classNameScroller} >:first-child`);
|
|
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button);
|
|
}
|
|
|
|
addButton() {
|
|
if (this.guildPatch) return;
|
|
const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds");
|
|
const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds");
|
|
if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component");
|
|
this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", {
|
|
after: this._appendButton
|
|
});
|
|
|
|
this._appendButton();
|
|
}
|
|
|
|
removeButton() {
|
|
this.guildPatch();
|
|
delete this.guildPatch;
|
|
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li").remove();
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/reactDevTools.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/reactDevTools.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
|
|
|
|
|
|
const electron = __webpack_require__(/*! electron */ "electron");
|
|
|
|
const fs = __webpack_require__(/*! fs */ "fs");
|
|
|
|
const path = __webpack_require__(/*! path */ "path");
|
|
|
|
const BrowserWindow = electron.remote.BrowserWindow;
|
|
const webContents = electron.remote.getCurrentWebContents();
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class reactDevTools {
|
|
constructor() {
|
|
let extensionPath = "";
|
|
if (process.platform === "win32") extensionPath = path.resolve(process.env.LOCALAPPDATA, "Google/Chrome/User Data");else if (process.platform === "linux") extensionPath = path.resolve(process.env.HOME, ".config/google-chrome");else if (process.platform === "darwin") extensionPath = path.resolve(process.env.HOME, "Library/Application Support/Google/Chrome");else extensionPath = path.resolve(process.env.HOME, ".config/chromium");
|
|
extensionPath += "/Default/Extensions/fmkadmapgofadopljbjfkapdkoienihi/";
|
|
|
|
if (fs.existsSync(extensionPath)) {
|
|
const versions = fs.readdirSync(extensionPath);
|
|
extensionPath = path.resolve(extensionPath, versions[versions.length - 1]);
|
|
}
|
|
|
|
this.extensionPath = extensionPath;
|
|
this.isExtensionInstalled = fs.existsSync(extensionPath);
|
|
this.listener = this.listener.bind(this);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_1__["settings"]["React DevTools"].hidden = !this.isExtensionInstalled;
|
|
}
|
|
|
|
listener() {
|
|
if (!this.isExtensionInstalled) return;
|
|
BrowserWindow.removeDevToolsExtension("React Developer Tools");
|
|
const didInstall = BrowserWindow.addDevToolsExtension(this.extensionPath);
|
|
if (didInstall) _utils__WEBPACK_IMPORTED_MODULE_0__["default"].log("React DevTools", "Successfully installed react devtools.");else _utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("React DevTools", "Couldn't find react devtools in chrome extensions!");
|
|
}
|
|
|
|
start() {
|
|
setImmediate(() => webContents.on("devtools-opened", this.listener));
|
|
if (webContents.isDevToolsOpened()) this.listener();
|
|
}
|
|
|
|
stop() {
|
|
webContents.removeListener("devtools-opened", this.listener);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/settingsPanel.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/settingsPanel.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsPanelSidebar */ "./src/modules/settingsPanelSidebar.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
|
|
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
|
|
/* harmony import */ var _reactDevTools__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./reactDevTools */ "./src/modules/reactDevTools.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
|
|
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
|
|
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
|
|
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
|
|
/* harmony import */ var _ui_tools__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/tools */ "./src/ui/tools.js");
|
|
/* harmony import */ var _ui_scroller__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/scroller */ "./src/ui/scroller.js");
|
|
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
|
|
/* harmony import */ var _ui_settingsPanel__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/settingsPanel */ "./src/ui/settingsPanel.js");
|
|
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
|
|
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
|
|
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
|
|
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
|
|
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_24___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_24__);
|
|
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
|
|
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
|
|
/* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel {
|
|
constructor() {
|
|
this.sideBarOnClick = this.sideBarOnClick.bind(this);
|
|
this.onChange = this.onChange.bind(this);
|
|
this.updateSettings = this.updateSettings.bind(this);
|
|
this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"](this.sideBarOnClick); // this.buildPluginProps = this.buildPluginProps.bind(this);
|
|
// this.buildThemeProps = this.buildThemeProps.bind(this);
|
|
|
|
this.showOriginal = this.showOriginal.bind(this);
|
|
}
|
|
|
|
get root() {
|
|
const _root = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#bd-settingspane-container");
|
|
|
|
if (!_root) {
|
|
if (!this.injectRoot()) return null;
|
|
return this.root;
|
|
}
|
|
|
|
return _root;
|
|
}
|
|
|
|
injectRoot() {
|
|
let [classNameLayer, classSidebar] = [BDModules.get(e => e.layer && e.animating)[0].layer.split(" ")[0], BDModules.get(e => e.standardSidebarView)[0]];
|
|
const sidebar = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("." + classNameLayer + " ." + classSidebar.standardSidebarView.split(" ")[0] + ", ." + classNameLayer + " .ui-standard-sidebar-view");
|
|
if (!sidebar) return false;
|
|
const root = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].createElement(`<div id="bd-settingspane-container" class="${classSidebar.contentRegion} content-region">`);
|
|
sidebar.append(root);
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].onRemoved(root, () => {
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(root);
|
|
});
|
|
return true;
|
|
}
|
|
|
|
get coreSettings() {
|
|
const settings = this.getSettings("core");
|
|
const categories = [...new Set(settings.map(s => s.category))];
|
|
const sections = categories.map(c => {
|
|
return {
|
|
title: c,
|
|
settings: settings.filter(s => s.category == c)
|
|
};
|
|
});
|
|
return sections;
|
|
}
|
|
|
|
get lightcordSettings() {
|
|
const settings = this.getSettings("lightcord");
|
|
const categories = [...new Set(settings.map(s => s.category))];
|
|
const sections = categories.map(c => {
|
|
return {
|
|
title: c,
|
|
settings: settings.filter(s => s.category == c)
|
|
};
|
|
});
|
|
return sections;
|
|
}
|
|
|
|
get PresenceSettings() {
|
|
return this.getSettings("status");
|
|
}
|
|
|
|
get MsgLogSettings() {
|
|
return this.getSettings("msglog");
|
|
}
|
|
|
|
getSettings(category) {
|
|
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
|
|
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
|
|
|
|
if (setting.cat === category && setting.implemented && !setting.hidden) {
|
|
setting.text = key;
|
|
arr.push(setting);
|
|
}
|
|
|
|
return arr;
|
|
}, []);
|
|
}
|
|
|
|
sideBarOnClick(id) {
|
|
const contentRegion = _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query(".contentRegion-3nDuYy, .content-region");
|
|
contentRegion.style.display = "none";
|
|
this.root.style.display = "";
|
|
|
|
switch (id) {
|
|
case "core":
|
|
this.renderCoreSettings();
|
|
break;
|
|
|
|
case "customcss":
|
|
this.renderCustomCssEditor();
|
|
break;
|
|
|
|
case "plugins":
|
|
case "themes":
|
|
this.renderAddonPane(id);
|
|
break;
|
|
|
|
case "lightcord":
|
|
this.renderLightcordSettings();
|
|
break;
|
|
|
|
case "status":
|
|
this.renderPresenceSettings();
|
|
break;
|
|
|
|
case "accountinfo":
|
|
this.renderAccountInfos();
|
|
break;
|
|
}
|
|
}
|
|
|
|
onClick() {}
|
|
|
|
onChange(id, checked) {
|
|
this.updateSettings(id, checked);
|
|
}
|
|
|
|
updateSettings(id, enabled) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
|
|
|
|
if (id == "bda-gs-2") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal");
|
|
}
|
|
|
|
if (id == "bda-gs-3") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(document.body, "bd-minimal-chan");
|
|
}
|
|
|
|
if (id == "bda-gs-1") {
|
|
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].removeButton();
|
|
}
|
|
|
|
if (id == "bda-gs-4") {
|
|
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].stop();
|
|
}
|
|
|
|
if (id == "bda-gs-5") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
|
|
}
|
|
|
|
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
|
|
|
|
if (id == "bda-gs-7") {
|
|
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].removeColoredText();
|
|
}
|
|
|
|
if (id == "fork-ps-4") {
|
|
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].stop();
|
|
}
|
|
|
|
if (id == "fork-ps-5") {
|
|
if (enabled) {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
|
|
} else {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme");
|
|
}
|
|
}
|
|
|
|
if (id == "fork-wp-1") {
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled);
|
|
if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136");
|
|
}
|
|
|
|
if (id == "bda-gs-8") {
|
|
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopDebugListener();
|
|
}
|
|
|
|
if (id == "fork-dm-1") {
|
|
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].stopCopySelector();
|
|
}
|
|
|
|
if (id === "reactDevTools") {
|
|
if (enabled) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();else _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].stop();
|
|
}
|
|
|
|
if (id === "lightcord-1") {
|
|
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
|
|
}
|
|
|
|
if (id === "lightcord-2") {
|
|
if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false;
|
|
}
|
|
|
|
if (id === "lightcord-presence-1") {
|
|
if (enabled) {
|
|
_CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
|
|
const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0];
|
|
|
|
if (settingsStore && !settingsStore.default.showCurrentGame) {
|
|
BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({
|
|
showCurrentGame: true
|
|
});
|
|
}
|
|
} else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
|
|
}
|
|
|
|
if (id === "lightcord-3") {
|
|
if (enabled) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(false);
|
|
}
|
|
|
|
if (id === "lightcord-4") {
|
|
if (enabled) {
|
|
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
|
|
} else {
|
|
_AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-6") {
|
|
if (enabled) {
|
|
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].enable();
|
|
} else {
|
|
_blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-7") {
|
|
if (enabled) {
|
|
_disableTyping__WEBPACK_IMPORTED_MODULE_27__["default"].enable();
|
|
} else {
|
|
_disableTyping__WEBPACK_IMPORTED_MODULE_27__["default"].disable();
|
|
}
|
|
}
|
|
|
|
this.saveSettings();
|
|
}
|
|
|
|
async initializeSettings() {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"].reactDevTools) _reactDevTools__WEBPACK_IMPORTED_MODULE_9__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(document.body, "bd-minimal-chan");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_11__["default"].addButton();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_12__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_10__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("#app-mount"), "bda-dark");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_8__["default"].inject24Hour();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_7__["default"].injectColoredText();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_13__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_24__["remote"].getCurrentWindow().setAlwaysOnTop(true);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_25__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_26__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_27__["default"].enable();
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startDebugListener();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_14__["default"].startCopySelector();
|
|
this.saveSettings();
|
|
}
|
|
|
|
saveSettings() {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]);
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]);
|
|
}
|
|
|
|
loadSettings() {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings"));
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc"));
|
|
}
|
|
|
|
showOriginal() {
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.unmountComponentAtNode(this.root);
|
|
this.root.style.display = "none";
|
|
_domtools__WEBPACK_IMPORTED_MODULE_10__["default"].query("." + BDModules.get(e => e.contentRegion)[0].contentRegion.split(" ")[0] + ", .content-region").style.display = "";
|
|
}
|
|
|
|
renderSidebar() {
|
|
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
|
|
|
|
for (const element of tabs) {
|
|
element.removeEventListener("click", this.showOriginal);
|
|
element.addEventListener("click", this.showOriginal);
|
|
}
|
|
|
|
this.sidebar.render();
|
|
}
|
|
|
|
get coreComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
|
contentColumn: true,
|
|
fade: true,
|
|
dark: true
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
|
key: "cspanel",
|
|
onChange: this.onChange,
|
|
sections: this.coreSettings
|
|
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
|
key: "tools"
|
|
}));
|
|
}
|
|
|
|
get lightcordComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
|
contentColumn: true,
|
|
fade: true,
|
|
dark: true
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_17__["default"], {
|
|
key: "lspannel",
|
|
onChange: this.onChange,
|
|
sections: this.lightcordSettings
|
|
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
|
key: "tools"
|
|
}));
|
|
}
|
|
|
|
get PresenceComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
|
contentColumn: true,
|
|
fade: true,
|
|
dark: true
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_21__["default"], {
|
|
key: "lppannel",
|
|
onChange: this.onChange,
|
|
settings: this.PresenceSettings
|
|
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
|
key: "tools"
|
|
}));
|
|
}
|
|
|
|
get AccountInfosComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
|
contentColumn: true,
|
|
fade: true,
|
|
dark: true
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_23__["default"], {
|
|
key: "lapannel"
|
|
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
|
key: "tools"
|
|
}));
|
|
}
|
|
|
|
get customCssComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_scroller__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
|
contentColumn: true,
|
|
fade: true,
|
|
dark: true
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_19__["default"], {
|
|
key: "csseditor"
|
|
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_tools__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
|
key: "tools"
|
|
}));
|
|
}
|
|
|
|
renderCoreSettings() {
|
|
const root = this.root;
|
|
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.coreComponent, root);
|
|
}
|
|
|
|
renderLightcordSettings() {
|
|
const root = this.root;
|
|
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.lightcordComponent, root);
|
|
}
|
|
|
|
renderPresenceSettings() {
|
|
const root = this.root;
|
|
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.PresenceComponent, root);
|
|
}
|
|
|
|
renderAccountInfos() {
|
|
const root = this.root;
|
|
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.AccountInfosComponent, root);
|
|
}
|
|
|
|
renderCustomCssEditor() {
|
|
const root = this.root;
|
|
if (!root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
_v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(this.customCssComponent, root);
|
|
} // renderAddonPane(type) {
|
|
// const root = this.root;
|
|
// if (!root) return Utils.err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i");
|
|
// BDV2.reactDom.render(this.contentComponent(type), root);
|
|
// }
|
|
|
|
|
|
renderAddonPane(type) {
|
|
if (!this.root) return _utils__WEBPACK_IMPORTED_MODULE_3__["default"].err("SettingsPanel", "FAILED TO LOCATE ROOT: .layer-3QrUeG .standardSidebarView-3F1I7i"); // 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", "");
|
|
this.onChange = this.onChange.bind(this);
|
|
}
|
|
|
|
componentDidMount() {
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-reloaded`, this.onChange);
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-loaded`, this.onChange);
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].on(`${this.prefix}-unloaded`, this.onChange);
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-reloaded`, this.onChange);
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-loaded`, this.onChange);
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_6__["default"].off(`${this.prefix}-unloaded`, this.onChange);
|
|
}
|
|
|
|
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
|
|
});
|
|
const list = type === "plugins" ? Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, {
|
|
type,
|
|
onChange: this.sideBarOnClick
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_20__["default"], {
|
|
type,
|
|
list
|
|
})), this.root);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/settingsPanelSidebar.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/modules/settingsPanelSidebar.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2_SettingsPanel_Sidebar; });
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _ui_sidebar__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/sidebar */ "./src/ui/sidebar.js");
|
|
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
|
|
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class V2_SettingsPanel_Sidebar {
|
|
constructor(onClick) {
|
|
this.onClick = onClick;
|
|
}
|
|
|
|
get items() {
|
|
return [{
|
|
text: "BetterDiscord Settings",
|
|
id: "core"
|
|
}, {
|
|
text: "Plugins",
|
|
id: "plugins"
|
|
}, {
|
|
text: "Themes",
|
|
id: "themes"
|
|
}, {
|
|
text: "Custom CSS",
|
|
id: "customcss"
|
|
}];
|
|
}
|
|
|
|
get LCitems() {
|
|
return [{
|
|
text: "Lightcord Settings",
|
|
id: "lightcord"
|
|
}, {
|
|
text: "RichPresence",
|
|
id: "status"
|
|
}, {
|
|
text: "Account Info",
|
|
id: "accountinfo"
|
|
}];
|
|
}
|
|
|
|
get component() {
|
|
//<TooltipWrap color="black" side="top" text={title}>
|
|
const changelogButton = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BBD's Changelog"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
className: "bd-changelog-button",
|
|
onClick: () => {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
className: "bd-icon",
|
|
size: "16px"
|
|
})));
|
|
const changelogButtonLC = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord's Changelog"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
className: "bd-changelog-button",
|
|
onClick: () => {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["LCChanelog"]);
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
className: "bd-icon",
|
|
size: "16px"
|
|
})));
|
|
return [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", null, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_sidebar__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
onClick: this.onClick,
|
|
headerText: "Lightcord",
|
|
headerButton: changelogButtonLC,
|
|
items: this.LCitems
|
|
})), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", null, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_ui_sidebar__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
onClick: this.onClick,
|
|
headerText: "Bandaged BD",
|
|
headerButton: changelogButton,
|
|
items: this.items
|
|
}))];
|
|
}
|
|
|
|
get root() {
|
|
const _root = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#bd-settings-sidebar");
|
|
|
|
if (!_root) {
|
|
if (!this.injectRoot()) return null;
|
|
return this.root;
|
|
}
|
|
|
|
return _root;
|
|
}
|
|
|
|
injectRoot() {
|
|
const tabs = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].queryAll("[class*='side-'] > [class*='item-']:not([class*=Danger])");
|
|
const changeLog = tabs[tabs.length - 1];
|
|
if (!changeLog) return false;
|
|
changeLog.parentElement.insertBefore(_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div id="bd-settings-sidebar">`), changeLog.previousElementSibling);
|
|
return true;
|
|
}
|
|
|
|
render() {
|
|
const root = this.root;
|
|
|
|
if (!root) {
|
|
console.log("FAILED TO LOCATE ROOT: [class*='side-'] > [class*='item-']:not([class*=Danger])");
|
|
return;
|
|
}
|
|
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(this.component, root);
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].onRemoved(root, () => {
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.unmountComponentAtNode(root);
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/themeModule.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/themeModule.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ThemeModule {
|
|
get folder() {
|
|
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder;
|
|
}
|
|
|
|
}
|
|
|
|
ThemeModule.prototype.loadThemes = async function () {
|
|
this.loadThemeData();
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes()));
|
|
const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
|
|
|
|
for (let i = 0; i < themes.length; i++) {
|
|
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]];
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
|
|
}
|
|
|
|
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];
|
|
|
|
const cancel = () => {
|
|
if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console
|
|
|
|
what[methodName] = origMethod;
|
|
};
|
|
|
|
what[methodName] = function () {
|
|
const data = {
|
|
thisObject: this,
|
|
methodArguments: arguments,
|
|
cancelPatch: cancel,
|
|
originalMethod: origMethod,
|
|
callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)
|
|
};
|
|
|
|
if (instead) {
|
|
const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data);
|
|
if (tempRet !== undefined) data.returnValue = tempRet;
|
|
} else {
|
|
if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data);
|
|
data.callOriginalMethod();
|
|
if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data);
|
|
}
|
|
|
|
if (once) cancel();
|
|
return data.returnValue;
|
|
};
|
|
|
|
Object.assign(what[methodName], origMethod);
|
|
what[methodName].__monkeyPatched = true;
|
|
what[methodName].displayName = displayName;
|
|
|
|
if (!what[methodName].__originalMethod) {
|
|
what[methodName].__originalMethod = origMethod;
|
|
|
|
what[methodName].toString = function () {
|
|
return origMethod.toString();
|
|
};
|
|
}
|
|
|
|
return cancel;
|
|
}
|
|
|
|
static onRemoved(node, callback) {
|
|
const observer = new MutationObserver(mutations => {
|
|
for (let m = 0; m < mutations.length; m++) {
|
|
const mutation = mutations[m];
|
|
const nodes = Array.from(mutation.removedNodes);
|
|
const directMatch = nodes.indexOf(node) > -1;
|
|
const parentMatch = nodes.some(parent => parent.contains(node));
|
|
|
|
if (directMatch || parentMatch) {
|
|
observer.disconnect();
|
|
callback();
|
|
}
|
|
}
|
|
});
|
|
observer.observe(document.body, {
|
|
subtree: true,
|
|
childList: true
|
|
});
|
|
}
|
|
|
|
static getNestedProp(obj, path) {
|
|
return path.split(/\s?\.\s?/).reduce(function (obj, prop) {
|
|
return obj && obj[prop];
|
|
}, obj);
|
|
}
|
|
/**
|
|
* This shows a toast similar to android towards the bottom of the screen.
|
|
*
|
|
* @param {string} content The string to show in the toast.
|
|
* @param {object} options Options object. Optional parameter.
|
|
* @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: ""
|
|
* @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true
|
|
* @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000
|
|
*/
|
|
|
|
|
|
static showToast(content, options = {}) {
|
|
if (!document.querySelector(".bd-toasts")) {
|
|
const container = document.querySelector("." + BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar.split(" ")[9] + " + div") || null;
|
|
const memberlist = container ? container.querySelector("." + BDModules.get(e => e.membersWrap)[0].membersWrap) : null;
|
|
const form = container ? container.querySelector("form") : null;
|
|
const left = container ? container.getBoundingClientRect().left : 310;
|
|
const right = memberlist ? memberlist.getBoundingClientRect().left : 0;
|
|
const width = right ? right - container.getBoundingClientRect().left : Utils.screenWidth - left - 240;
|
|
const bottom = form ? form.offsetHeight : 80;
|
|
const toastWrapper = document.createElement("div");
|
|
toastWrapper.classList.add("bd-toasts");
|
|
toastWrapper.style.setProperty("left", left + "px");
|
|
toastWrapper.style.setProperty("width", width + "px");
|
|
toastWrapper.style.setProperty("bottom", bottom + "px");
|
|
document.querySelector("#app-mount").appendChild(toastWrapper);
|
|
}
|
|
|
|
const {
|
|
type = "",
|
|
icon = true,
|
|
timeout = 3000
|
|
} = options;
|
|
const toastElem = document.createElement("div");
|
|
toastElem.classList.add("bd-toast");
|
|
if (type) toastElem.classList.add("toast-" + type);
|
|
if (type && icon) toastElem.classList.add("icon");
|
|
toastElem.innerText = content;
|
|
document.querySelector(".bd-toasts").appendChild(toastElem);
|
|
setTimeout(() => {
|
|
toastElem.classList.add("closing");
|
|
setTimeout(() => {
|
|
toastElem.remove();
|
|
if (!document.querySelectorAll(".bd-toasts .bd-toast").length) document.querySelector(".bd-toasts").remove();
|
|
}, 300);
|
|
}, timeout);
|
|
}
|
|
|
|
static alert(title, content) {
|
|
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
|
|
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
|
|
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
|
|
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="bd-modal-wrapper theme-dark">
|
|
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
|
|
<div class="bd-modal ${modalModule.modal}">
|
|
<div class="bd-modal-inner ${modalModule.inner}">
|
|
<div class="header ${headerModule.header}">
|
|
<div class="title">${title}</div>
|
|
</div>
|
|
<div class="bd-modal-body">
|
|
<div class="scroller-wrap fade">
|
|
<div class="scroller">
|
|
${content}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
|
|
<button type="button">Okay</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>`);
|
|
modal.querySelector(".footer button").addEventListener("click", () => {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
|
|
setTimeout(() => {
|
|
modal.remove();
|
|
closingListeners.forEach(listener => {
|
|
try {
|
|
listener();
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
});
|
|
}, 300);
|
|
});
|
|
modal.querySelector(".bd-backdrop").addEventListener("click", () => {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
|
|
setTimeout(() => {
|
|
modal.remove();
|
|
closingListeners.forEach(listener => {
|
|
try {
|
|
listener();
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
});
|
|
}, 300);
|
|
});
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal);
|
|
const closingListeners = [];
|
|
return {
|
|
close: () => {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
|
|
setTimeout(() => {
|
|
modal.remove();
|
|
closingListeners.forEach(listener => {
|
|
try {
|
|
listener();
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
});
|
|
}, 300);
|
|
},
|
|
onClose: listener => {
|
|
closingListeners.push(listener);
|
|
}
|
|
};
|
|
}
|
|
|
|
static showContentErrors({
|
|
plugins: pluginErrors = [],
|
|
themes: themeErrors = []
|
|
}) {
|
|
if (!pluginErrors || !themeErrors) return;
|
|
if (!pluginErrors.length && !themeErrors.length) return;
|
|
let modalModule = BDModules.get(e => e.modal && e.inner && !e.hideOnFullscreen)[0];
|
|
let headerModule = BDModules.get(e => e.header && e.responsiveWidthMobile && e.hideOnFullscreen)[0];
|
|
let footer2Module = BDModules.get(e => e.header && e.responsiveWidthMobile && e.focusLock)[0];
|
|
const modal = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="bd-modal-wrapper theme-dark">
|
|
<div class="bd-backdrop ${BDModules.get(e => e.backdrop && e.backdropWithLayer)[0].backdrop}"></div>
|
|
<div class="bd-modal bd-content-modal ${modalModule.modal}">
|
|
<div class="bd-modal-inner ${modalModule.inner}">
|
|
<div class="header ${headerModule.header}"><div class="title">Content Errors</div></div>
|
|
<div class="bd-modal-body">
|
|
<div class="tab-bar-container">
|
|
<div class="tab-bar TOP">
|
|
<div class="tab-bar-item">Plugins</div>
|
|
<div class="tab-bar-item">Themes</div>
|
|
</div>
|
|
</div>
|
|
<div class="table-header">
|
|
<div class="table-column column-name">Name</div>
|
|
<div class="table-column column-message">Message</div>
|
|
<div class="table-column column-error">Error</div>
|
|
</div>
|
|
<div class="scroller-wrap fade">
|
|
<div class="scroller">
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="footer ${headerModule.footer} ${footer2Module.footer}">
|
|
<button type="button">Okay</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>`);
|
|
|
|
function generateTab(errors) {
|
|
const container = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="errors">`);
|
|
|
|
for (const err of errors) {
|
|
const error = _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].createElement(`<div class="error">
|
|
<div class="table-column column-name">${err.name ? err.name : err.file}</div>
|
|
<div class="table-column column-message">${err.message}</div>
|
|
<div class="table-column column-error"><a class="error-link" href="">${err.error ? err.error.message : ""}</a></div>
|
|
</div>`);
|
|
container.append(error);
|
|
|
|
if (err.error) {
|
|
error.querySelectorAll("a").forEach(el => el.addEventListener("click", e => {
|
|
e.preventDefault();
|
|
Utils.err("ContentManager", `Error details for ${err.name ? err.name : err.file}.`, err.error);
|
|
}));
|
|
}
|
|
}
|
|
|
|
return container;
|
|
}
|
|
|
|
const tabs = [generateTab(pluginErrors), generateTab(themeErrors)];
|
|
modal.querySelectorAll(".tab-bar-item").forEach(el => el.addEventListener("click", e => {
|
|
e.preventDefault();
|
|
const selected = modal.querySelector(".tab-bar-item.selected");
|
|
if (selected) _domtools__WEBPACK_IMPORTED_MODULE_3__["default"].removeClass(selected, "selected");
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(e.target, "selected");
|
|
const scroller = modal.querySelector(".scroller");
|
|
scroller.innerHTML = "";
|
|
scroller.append(tabs[_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].index(e.target)]);
|
|
}));
|
|
modal.querySelector(".footer button").addEventListener("click", () => {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
|
|
setTimeout(() => {
|
|
modal.remove();
|
|
}, 300);
|
|
});
|
|
modal.querySelector(".bd-backdrop").addEventListener("click", () => {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].addClass(modal, "closing");
|
|
setTimeout(() => {
|
|
modal.remove();
|
|
}, 300);
|
|
});
|
|
_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].query("#app-mount").append(modal);
|
|
if (pluginErrors.length) modal.querySelector(".tab-bar-item").click();else modal.querySelectorAll(".tab-bar-item")[1].click();
|
|
}
|
|
|
|
static showChangelogModal(options = {}) {
|
|
const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
|
|
const ChangelogClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("fixed", "improved");
|
|
const TextElement = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Text");
|
|
const FlexChild = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Child");
|
|
const Titles = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("Tags", "default");
|
|
const Changelog = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.defaultProps.selectable == false);
|
|
const MarkdownParser = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("defaultRules", "parse");
|
|
if (!Changelog || !ModalStack || !ChangelogClasses || !TextElement || !FlexChild || !Titles || !MarkdownParser) return;
|
|
const {
|
|
image = "https://repository-images.githubusercontent.com/105473537/957b5480-7c26-11e9-8401-50fa820cbae5",
|
|
description = "",
|
|
changes = [],
|
|
title = "BandagedBD",
|
|
subtitle = `v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]}`,
|
|
footer
|
|
} = options;
|
|
const ce = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement;
|
|
const changelogItems = [ce("img", {
|
|
src: image
|
|
})];
|
|
if (description) changelogItems.push(ce("p", null, MarkdownParser.parse(description)));
|
|
|
|
for (let c = 0; c < changes.length; c++) {
|
|
const entry = changes[c];
|
|
const type = ChangelogClasses[entry.type] ? ChangelogClasses[entry.type] : ChangelogClasses.added;
|
|
const margin = c == 0 ? ChangelogClasses.marginTop : "";
|
|
changelogItems.push(ce("h1", {
|
|
className: `${type} ${margin}`
|
|
}, entry.title));
|
|
const list = ce("ul", null, entry.items.map(i => ce("li", null, MarkdownParser.parse(i))));
|
|
changelogItems.push(list);
|
|
}
|
|
|
|
const renderHeader = function () {
|
|
return ce(FlexChild.Child, {
|
|
grow: 1,
|
|
shrink: 1
|
|
}, ce(Titles.default, {
|
|
tag: Titles.Tags.H4
|
|
}, title), ce(TextElement, {
|
|
size: TextElement.Sizes.SMALL,
|
|
color: TextElement.Colors.STANDARD,
|
|
className: ChangelogClasses.date
|
|
}, subtitle));
|
|
};
|
|
|
|
const renderFooter = () => {
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.displayName == "Anchor");
|
|
const AnchorClasses = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("anchorUnderlineOnHover") || {
|
|
anchor: "anchor-3Z-8Bb",
|
|
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
|
|
};
|
|
|
|
const joinSupportServer = click => {
|
|
click.preventDefault();
|
|
click.stopPropagation();
|
|
ModalStack.pop();
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].joinBD2();
|
|
};
|
|
|
|
const supportLink = Anchor ? ce(Anchor, {
|
|
onClick: joinSupportServer
|
|
}, "Join our Discord Server.") : ce("a", {
|
|
className: `${AnchorClasses.anchor} ${AnchorClasses.anchorUnderlineOnHover}`,
|
|
onClick: joinSupportServer
|
|
}, "Join our Discord Server.");
|
|
const defaultFooter = ce(TextElement, {
|
|
size: TextElement.Sizes.SMALL,
|
|
color: TextElement.Colors.STANDARD
|
|
}, "Need support? ", supportLink);
|
|
return ce(FlexChild.Child, {
|
|
grow: 1,
|
|
shrink: 1
|
|
}, footer ? footer : defaultFooter);
|
|
};
|
|
|
|
return ModalStack.push(function (props) {
|
|
return ce(Changelog, Object.assign({
|
|
className: ChangelogClasses.container,
|
|
selectable: true,
|
|
onScroll: _ => _,
|
|
onClose: _ => _,
|
|
renderHeader: renderHeader,
|
|
renderFooter: renderFooter,
|
|
children: changelogItems
|
|
}, props));
|
|
});
|
|
}
|
|
/**
|
|
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
|
|
* @param {string} title - title of the modal
|
|
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
|
|
* @param {object} [options] - options to modify the modal
|
|
* @param {boolean} [options.danger=false] - whether the main button should be red or not
|
|
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
|
|
* @param {string} [options.cancelText=Cancel] - text for the cancel button
|
|
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
|
|
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
|
|
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
|
|
* @returns {string} - the key used for this modal
|
|
*/
|
|
|
|
|
|
static showConfirmationModal(title, content, options = {}) {
|
|
const ModalStack = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("push", "update", "pop", "popWithKey");
|
|
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
|
|
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].find(m => m.defaultProps && m.key && m.key() == "confirm-modal");
|
|
if (!ModalStack || !ConfirmationModal || !Markdown) return Utils.alert(title, content);
|
|
|
|
const emptyFunction = () => {};
|
|
|
|
const {
|
|
onConfirm = emptyFunction,
|
|
onCancel = emptyFunction,
|
|
confirmText = "Okay",
|
|
cancelText = "Cancel",
|
|
danger = false,
|
|
key = undefined
|
|
} = options;
|
|
if (!Array.isArray(content)) content = [content];
|
|
content = content.map(c => typeof c === "string" ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Markdown, null, c) : c);
|
|
return ModalStack.push(ConfirmationModal, {
|
|
header: title,
|
|
children: content,
|
|
red: danger,
|
|
confirmText: confirmText,
|
|
cancelText: cancelText,
|
|
onConfirm: onConfirm,
|
|
onCancel: onCancel
|
|
}, key);
|
|
}
|
|
|
|
static removeDa(className) {
|
|
if (!className) return className;
|
|
return className.split(" ").filter(e => !e.startsWith("da-")).join(" ");
|
|
}
|
|
|
|
}
|
|
Utils.showToast = Utils.suppressErrors(Utils.showToast, "Could not show toast.");
|
|
window.Lightcord.BetterDiscord.Utils = Utils;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/v2.js":
|
|
/*!***************************!*\
|
|
!*** ./src/modules/v2.js ***!
|
|
\***************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class V2 {
|
|
constructor() {
|
|
this.editorDetached = false;
|
|
|
|
this.WebpackModules = (() => {
|
|
const req = webpackJsonp.push([[], {
|
|
__extra_id__: (module, exports, req) => module.exports = req
|
|
}, [["__extra_id__"]]]);
|
|
delete req.m.__extra_id__;
|
|
delete req.c.__extra_id__;
|
|
|
|
const shouldProtect = theModule => {
|
|
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return true;
|
|
if (theModule.getToken || theModule.getEmail || theModule.showToken) return true;
|
|
return false;
|
|
};
|
|
|
|
const protect = theModule => {
|
|
if (theModule.remove && theModule.set && theModule.clear && theModule.get && !theModule.sort) return null;
|
|
if (!theModule.getToken && !theModule.getEmail && !theModule.showToken) return theModule;
|
|
const proxy = new Proxy(theModule, {
|
|
getOwnPropertyDescriptor: function (obj, prop) {
|
|
if (prop === "getToken" || prop === "getEmail" || prop === "showToken") return undefined;
|
|
return Object.getOwnPropertyDescriptor(obj, prop);
|
|
},
|
|
get: function (obj, func) {
|
|
if (func == "getToken") return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa";
|
|
if (func == "getEmail") return () => "puppet11112@gmail.com";
|
|
if (func == "showToken") return () => true; // if (func == "__proto__") return proxy;
|
|
|
|
return obj[func];
|
|
}
|
|
});
|
|
return proxy;
|
|
};
|
|
|
|
const find = filter => {
|
|
for (const i in req.c) {
|
|
if (req.c.hasOwnProperty(i)) {
|
|
const m = req.c[i].exports;
|
|
if (m && m.__esModule && m.default && filter(m.default)) return protect(m.default);
|
|
if (m && filter(m)) return protect(m);
|
|
}
|
|
} // console.warn("Cannot find loaded module in cache");
|
|
|
|
|
|
return null;
|
|
};
|
|
|
|
const findAll = filter => {
|
|
const modules = [];
|
|
|
|
for (const i in req.c) {
|
|
if (req.c.hasOwnProperty(i)) {
|
|
const m = req.c[i].exports;
|
|
if (m && m.__esModule && m.default && filter(m.default)) modules.push(protect(m.default));else if (m && filter(m)) modules.push(protect(m));
|
|
}
|
|
}
|
|
|
|
return modules;
|
|
};
|
|
|
|
const findByUniqueProperties = propNames => find(module => propNames.every(prop => module[prop] !== undefined));
|
|
|
|
const findByPrototypes = protoNames => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
|
|
|
|
const findByDisplayName = displayName => find(module => module.displayName === displayName);
|
|
|
|
return {
|
|
find,
|
|
findAll,
|
|
findByUniqueProperties,
|
|
findByPrototypes,
|
|
findByDisplayName
|
|
};
|
|
})();
|
|
|
|
this.internal = {
|
|
react: this.WebpackModules.findByUniqueProperties(["Component", "PureComponent", "Children", "createElement", "cloneElement"]),
|
|
reactDom: this.WebpackModules.findByUniqueProperties(["findDOMNode"])
|
|
};
|
|
|
|
this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith("__reactInternalInstance"))];
|
|
}
|
|
|
|
initialize() {}
|
|
|
|
joinBD1() {
|
|
this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd");
|
|
}
|
|
|
|
leaveBD1() {
|
|
this.GuildActions.leaveGuild("86004744966914048");
|
|
}
|
|
|
|
joinBD2() {
|
|
this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j");
|
|
}
|
|
|
|
leaveBD2() {
|
|
this.GuildActions.leaveGuild("280806472928198656");
|
|
}
|
|
|
|
joinLC() {
|
|
this.InviteActions.acceptInviteAndTransitionToInviteChannel("cxfA2dT");
|
|
}
|
|
|
|
leaveLC() {
|
|
this.GuildActions.leaveGuild("705908350218666117");
|
|
}
|
|
/**
|
|
* @type {typeof React}
|
|
*/
|
|
|
|
|
|
get react() {
|
|
return this.internal.react;
|
|
}
|
|
/**
|
|
* @type {typeof React}
|
|
*/
|
|
|
|
|
|
get React() {
|
|
return this.internal.react;
|
|
}
|
|
/**
|
|
* @type {typeof import("react-dom")}
|
|
*/
|
|
|
|
|
|
get reactDom() {
|
|
return this.internal.reactDom;
|
|
}
|
|
/**
|
|
* @type {typeof import("react-dom")}
|
|
*/
|
|
|
|
|
|
get ReactDom() {
|
|
return this.internal.reactDom;
|
|
}
|
|
/**
|
|
* @type {typeof React.Component}
|
|
*/
|
|
|
|
|
|
get reactComponent() {
|
|
return this.internal.react.Component;
|
|
}
|
|
/**
|
|
* @type {typeof React.Component}
|
|
*/
|
|
|
|
|
|
get ReactComponent() {
|
|
return this.internal.react.Component;
|
|
}
|
|
|
|
get anchorClasses() {
|
|
return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"]) || {
|
|
anchor: "anchor-3Z-8Bb",
|
|
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
|
|
};
|
|
}
|
|
|
|
get slateEditorClasses() {
|
|
return this.WebpackModules.findByUniqueProperties(["slateTextArea"]);
|
|
}
|
|
|
|
get messageClasses() {
|
|
return this.WebpackModules.findByUniqueProperties(["message", "containerCozy"]);
|
|
}
|
|
|
|
get guildClasses() {
|
|
const guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0];
|
|
const guilds = BDModules.get(e => e.guildsError && e.selected)[0];
|
|
const pill = BDModules.get(e => e.blobContainer)[0];
|
|
return Object.assign({}, guildsWrapper, guilds, pill);
|
|
}
|
|
|
|
get MessageContentComponent() {
|
|
return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons"));
|
|
}
|
|
|
|
get MessageComponent() {
|
|
return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == "Message");
|
|
}
|
|
|
|
get TimeFormatter() {
|
|
return this.WebpackModules.findByUniqueProperties(["dateFormat"]);
|
|
}
|
|
|
|
get TooltipWrapper() {
|
|
return this.WebpackModules.findByDisplayName("Tooltip");
|
|
}
|
|
|
|
get NativeModule() {
|
|
return this.WebpackModules.findByUniqueProperties(["setBadge"]);
|
|
}
|
|
|
|
get InviteActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["acceptInvite"]);
|
|
}
|
|
|
|
get GuildActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["leaveGuild"]);
|
|
}
|
|
|
|
get Tooltips() {
|
|
return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss);
|
|
}
|
|
|
|
get KeyGenerator() {
|
|
return this.WebpackModules.find(m => m.toString && /"binary"/.test(m.toString()));
|
|
}
|
|
|
|
get LayerStack() {
|
|
return this.WebpackModules.findByUniqueProperties(["popLayer"]);
|
|
}
|
|
|
|
get UserStore() {
|
|
return this.WebpackModules.findByUniqueProperties(["getCurrentUser"]);
|
|
}
|
|
|
|
get ChannelStore() {
|
|
return this.WebpackModules.findByUniqueProperties(["getChannel"]);
|
|
}
|
|
|
|
get ChannelActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"]);
|
|
}
|
|
|
|
get PrivateChannelActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"]);
|
|
}
|
|
|
|
openDM(userId) {
|
|
const selfId = this.UserStore.getCurrentUser().id;
|
|
if (selfId == userId) return;
|
|
const privateChannelId = this.ChannelStore.getDMFromUserId(userId);
|
|
if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId);
|
|
this.ChannelActions.openPrivateChannel(selfId, userId);
|
|
}
|
|
|
|
parseSettings(cat) {
|
|
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
|
|
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
|
|
|
|
if (setting.cat === cat && setting.implemented && !setting.hidden) {
|
|
setting.text = key;
|
|
arr.push(setting);
|
|
}
|
|
|
|
return arr;
|
|
}, []);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/voiceMode.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/modules/voiceMode.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
const style = `
|
|
.container-2Rl01u {
|
|
display: none!important;
|
|
}
|
|
|
|
.chat-3bRxxu {
|
|
display: none!important;
|
|
}
|
|
|
|
.sidebar-2K8pFh {
|
|
flex-grow: 1!important;
|
|
}
|
|
`;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class VoiceMode {
|
|
start() {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("VoiceMode", style);
|
|
}
|
|
|
|
stop() {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("VoiceMode");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/webpackModules.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/modules/webpackModules.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
const req = webpackJsonp.push([[], {
|
|
__extra_id__: (module, exports, req) => module.exports = req
|
|
}, [["__extra_id__"]]]);
|
|
delete req.m.__extra_id__;
|
|
delete req.c.__extra_id__;
|
|
|
|
const find = filter => {
|
|
for (const i in req.c) {
|
|
if (req.c.hasOwnProperty(i)) {
|
|
const m = req.c[i].exports;
|
|
if (m && m.__esModule && m.default && filter(m.default)) return m.default;
|
|
if (m && filter(m)) return m;
|
|
}
|
|
} // console.warn("Cannot find loaded module in cache");
|
|
|
|
|
|
return null;
|
|
};
|
|
|
|
const findAll = filter => {
|
|
const modules = [];
|
|
|
|
for (const i in req.c) {
|
|
if (req.c.hasOwnProperty(i)) {
|
|
const m = req.c[i].exports;
|
|
if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);else if (m && filter(m)) modules.push(m);
|
|
}
|
|
}
|
|
|
|
return modules;
|
|
};
|
|
|
|
const findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined));
|
|
|
|
const findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
|
|
|
|
const findByDisplayName = displayName => find(module => module.displayName === displayName);
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = ({
|
|
find,
|
|
findAll,
|
|
findByProps,
|
|
findByPrototypes,
|
|
findByDisplayName
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/svg/LightcordUser.jsx":
|
|
/*!***********************************!*\
|
|
!*** ./src/svg/LightcordUser.jsx ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordUserBadge; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
|
|
|
|
let profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
|
|
class LightcordUserBadge extends React.Component {
|
|
render() {
|
|
const props = this.props;
|
|
delete props.href.target;
|
|
console.log(props);
|
|
return React.createElement(props.Anchor, _extends({
|
|
href: "/users/" + props.user.id
|
|
}, props.href, {
|
|
onClick: ev => {
|
|
ev.preventDefault();
|
|
if (!profilModule) profilModule = BDModules.get(e => e.default && e.default.open && e.default.fetchMutualFriends)[0];
|
|
profilModule.default.open(props.user.id);
|
|
}
|
|
}), React.createElement("svg", _extends({
|
|
viewBox: "0 0 31.3 29.5"
|
|
}, props.svg, {
|
|
height: "100%"
|
|
}), React.createElement("path", {
|
|
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
|
|
fill: "rgba(227,6,19,.6)"
|
|
}), React.createElement("path", {
|
|
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
|
|
fill: "#e30613"
|
|
})));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/svg/bug_hunter.jsx":
|
|
/*!********************************!*\
|
|
!*** ./src/svg/bug_hunter.jsx ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BugHunterBadge; });
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
|
|
class BugHunterBadge extends React.Component {
|
|
render() {
|
|
const props = this.props;
|
|
return React.createElement("svg", _extends({
|
|
viewBox: "0 0 31.3 29.5"
|
|
}, props.svg, {
|
|
height: "100%"
|
|
}), React.createElement("path", {
|
|
d: "M22.8 1s12 8.2 7.4 19.7S16.6 29 20 25.6s-4-5.6-8.7-10L22.8 1",
|
|
fill: "rgba(227,6,19,.6)"
|
|
}), React.createElement("path", {
|
|
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
|
|
fill: "#e30613"
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/svg/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 contentModule = BDModules.get(e => e.contentColumn)[0];
|
|
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 (!contentModule) contentModule = BDModules.get(e => e.contentColumn)[0];
|
|
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("div", {
|
|
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
|
|
style: {
|
|
padding: "60px 40px 0px"
|
|
}
|
|
}, 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/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(".scroller");
|
|
if (!isHidden(container, thisNode)) return;
|
|
const thisNodeOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(thisNode);
|
|
const containerOffset = _modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].offset(container);
|
|
const original = container.scrollTop;
|
|
const endPoint = thisNodeOffset.top - containerOffset.top + container.scrollTop - 30;
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_3__["default"].animate({
|
|
duration: 300,
|
|
update: function (progress) {
|
|
if (endPoint > original) container.scrollTop = original + progress * (endPoint - original);else container.scrollTop = original - progress * (original - endPoint);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
getString(value) {
|
|
if (!value) return "???";
|
|
return typeof value == "string" ? value : value.toString();
|
|
}
|
|
|
|
get settingsComponent() {
|
|
try {
|
|
this.settingsPanel = this.props.addon.plugin.getSettingsPanel();
|
|
} catch (err) {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_2__["default"].err("Plugins", "Unable to get settings panel for " + this.name + ".", err);
|
|
}
|
|
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card bd-addon-card settings-open ui-switch-item",
|
|
ref: "cardNode"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
style: {
|
|
"float": "right",
|
|
"cursor": "pointer"
|
|
},
|
|
onClick: () => {
|
|
this.refs.settingspanel.innerHTML = "";
|
|
this.setState({
|
|
settings: false
|
|
});
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_4__["default"], null)), typeof this.settingsPanel === "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
id: `plugin-settings-${this.name}`,
|
|
className: "plugin-settings",
|
|
ref: "settingspanel"
|
|
}), typeof this.settingsPanel !== "object" && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
id: `plugin-settings-${this.name}`,
|
|
className: "plugin-settings",
|
|
ref: "settingspanel",
|
|
dangerouslySetInnerHTML: {
|
|
__html: this.settingsPanel
|
|
}
|
|
}));
|
|
}
|
|
|
|
buildTitle(name, version, author) {
|
|
const title = "{{name}} v{{version}} by {{author}}".split(/({{[A-Za-z]+}})/);
|
|
const nameIndex = title.findIndex(s => s == "{{name}}");
|
|
if (nameIndex) title[nameIndex] = React.createElement("span", {
|
|
className: "name bda-name"
|
|
}, name);
|
|
const versionIndex = title.findIndex(s => s == "{{version}}");
|
|
if (nameIndex) title[versionIndex] = React.createElement("span", {
|
|
className: "version bda-version"
|
|
}, version);
|
|
const authorIndex = title.findIndex(s => s == "{{author}}");
|
|
|
|
if (nameIndex) {
|
|
const props = {
|
|
className: "author bda-author"
|
|
};
|
|
|
|
if (author.link || author.id) {
|
|
props.className += ` ${anchorClasses.anchor} ${anchorClasses.anchorUnderlineOnHover}`;
|
|
props.target = "_blank";
|
|
if (author.link) props.href = author.link;
|
|
if (author.id) props.onClick = () => {
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].openDM(author.id);
|
|
};
|
|
}
|
|
|
|
title[authorIndex] = React.createElement(author.link || author.id ? "a" : "span", props, author.name);
|
|
}
|
|
|
|
return title.flat();
|
|
}
|
|
|
|
makeLink(title, url) {
|
|
const props = {
|
|
className: "bda-link bda-link-website",
|
|
target: "_blank"
|
|
};
|
|
if (typeof url == "string") props.href = url;
|
|
if (typeof url == "function") props.onClick = event => {
|
|
event.preventDefault();
|
|
event.stopPropagation();
|
|
url();
|
|
};
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("a", props, title);
|
|
}
|
|
|
|
makeButton(title, children, action) {
|
|
return React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: title
|
|
}, React.createElement("div", {
|
|
className: "bd-addon-button",
|
|
onClick: action
|
|
}, children));
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this.unmounted = true;
|
|
}
|
|
|
|
get links() {
|
|
const links = [];
|
|
const addon = this.props.addon;
|
|
if (addon.website) links.push(this.makeLink("Website", addon.website));
|
|
if (addon.source) links.push(this.makeLink("Source", addon.source));
|
|
|
|
if (addon.invite) {
|
|
links.push(this.makeLink("Support Server", () => {
|
|
const tester = /\.gg\/(.*)$/;
|
|
let code = addon.invite;
|
|
if (tester.test(code)) code = code.match(tester)[1];
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].InviteActions.acceptInviteAndTransitionToInviteChannel(code);
|
|
}));
|
|
}
|
|
|
|
if (addon.donate) links.push(this.makeLink("Donate", addon.donate));
|
|
if (addon.patreon) links.push(this.makeLink("Patreon", addon.patreon));
|
|
return links;
|
|
}
|
|
|
|
get footer() {
|
|
const links = this.links;
|
|
return (links.length || this.hasSettings) && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card-footer bda-footer"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("span", {
|
|
className: "bd-addon-links bda-links"
|
|
}, ...links.map((element, index) => index < links.length - 1 ? [element, " | "] : element).flat()), this.hasSettings && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
|
|
onClick: this.showSettings,
|
|
className: "bd-button bda-settings-button",
|
|
disabled: !this.state.checked
|
|
}, "Settings"));
|
|
}
|
|
|
|
onChange() {
|
|
this.props.toggle && this.props.toggle(this.name);
|
|
this.setState({
|
|
checked: !this.state.checked
|
|
});
|
|
}
|
|
|
|
edit() {
|
|
this.props.edit(this.name);
|
|
}
|
|
|
|
delete() {
|
|
this.props.remove(this.name);
|
|
}
|
|
|
|
reload() {
|
|
this.props.reload(this.name);
|
|
}
|
|
|
|
get name() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name);
|
|
}
|
|
|
|
get author() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author);
|
|
}
|
|
|
|
get description() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description);
|
|
}
|
|
|
|
get version() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version);
|
|
}
|
|
|
|
render() {
|
|
if (this.state.settings) return this.settingsComponent;
|
|
const {
|
|
authorId,
|
|
authorLink
|
|
} = this.props.addon;
|
|
const style = {};
|
|
|
|
if (!this.isScanning) {
|
|
this.isScanning = true;
|
|
Object(_modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__["processFile"])(Object(path__WEBPACK_IMPORTED_MODULE_12__["resolve"])(this.props.addon.filename.endsWith(".plugin.js") ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].themesFolder, this.props.addon.filename), result => {
|
|
if (this.unmounted) return;
|
|
this.setState({
|
|
isTrusted: !result.suspect
|
|
}, () => {});
|
|
});
|
|
} else {
|
|
if (this.state.isTrusted) {
|
|
style.borderColor = "#4087ed";
|
|
}
|
|
}
|
|
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card bd-addon-card settings-closed ui-switch-item",
|
|
style
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-addon-header bda-header"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card-title bda-header-title"
|
|
}, this.buildTitle(this.name, this.version, {
|
|
name: this.author,
|
|
id: authorId,
|
|
link: authorLink
|
|
})), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-addon-controls bda-controls"
|
|
}, this.props.edit && this.makeButton("Edit", React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
className: "bd-icon"
|
|
}), this.edit), this.props.remove && this.makeButton("Delete", React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
|
className: "bd-icon"
|
|
}), this.delete), this.props.reload && this.makeButton("Reload", React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
className: "bd-icon"
|
|
}), this.reload), React.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_8__["default"], {
|
|
onChange: this.onChange,
|
|
checked: this.state.checked
|
|
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-scroller-wrap bda-description-wrap scroller-wrap fade"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-scroller bd-addon-description bda-description scroller"
|
|
}, this.description)), this.footer);
|
|
}
|
|
|
|
}
|
|
const originalRender = V2C_PluginCard.prototype.render;
|
|
Object.defineProperty(V2C_PluginCard.prototype, "render", {
|
|
enumerable: false,
|
|
configurable: false,
|
|
set: function () {
|
|
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
|
|
},
|
|
get: () => originalRender
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/addonlist.jsx":
|
|
/*!******************************!*\
|
|
!*** ./src/ui/addonlist.jsx ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CardList; });
|
|
/* harmony import */ var _errorBoundary__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errorBoundary */ "./src/ui/errorBoundary.js");
|
|
/* harmony import */ var _contentColumn__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentColumn */ "./src/ui/contentColumn.js");
|
|
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools */ "./src/ui/tools.js");
|
|
/* harmony import */ var _reloadIcon__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
|
|
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
|
|
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./scroller */ "./src/ui/scroller.js");
|
|
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
|
|
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js");
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const Tooltip = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_13__["default"].findByDisplayName("Tooltip");
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].react;
|
|
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_10__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
sort: "name",
|
|
ascending: true,
|
|
query: ""
|
|
};
|
|
this.isPlugins = this.props.type == "plugins";
|
|
this.cookie = this.isPlugins ? _0globals__WEBPACK_IMPORTED_MODULE_8__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_8__["themeCookie"];
|
|
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_11__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_12__["default"];
|
|
this.sort = this.sort.bind(this);
|
|
this.reverse = this.reverse.bind(this);
|
|
this.search = this.search.bind(this);
|
|
}
|
|
|
|
openFolder() {
|
|
__webpack_require__(/*! electron */ "electron").shell.openItem(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_9__["default"].themesFolder);
|
|
}
|
|
|
|
edit(name) {
|
|
console.log(name);
|
|
this.manager.edit(name);
|
|
}
|
|
|
|
async delete(name) {
|
|
const shouldDelete = await this.confirmDelete(name);
|
|
if (!shouldDelete) return;
|
|
this.manager.delete(name);
|
|
}
|
|
|
|
confirmDelete(name) {
|
|
return new Promise(resolve => {
|
|
_modules_bdApi__WEBPACK_IMPORTED_MODULE_14__["default"].showConfirmationModal("Are You Sure?", `Are you sure you want to delete ${name}?`, {
|
|
danger: true,
|
|
confirmText: "Delete",
|
|
onConfirm: () => {
|
|
resolve(true);
|
|
},
|
|
onCancel: () => {
|
|
resolve(false);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
get sortOptions() {
|
|
return [{
|
|
label: "Name",
|
|
value: "name"
|
|
}, {
|
|
label: "Author",
|
|
value: "author"
|
|
}, {
|
|
label: "Version",
|
|
value: "version"
|
|
}, {
|
|
label: "Recently Added",
|
|
value: "added"
|
|
}, {
|
|
label: "Last Modified",
|
|
value: "modified"
|
|
}, {
|
|
label: "File Size",
|
|
value: "size"
|
|
}];
|
|
}
|
|
|
|
get directions() {
|
|
return [{
|
|
label: "Ascending",
|
|
value: true
|
|
}, {
|
|
label: "Descending",
|
|
value: false
|
|
}];
|
|
}
|
|
|
|
reverse(value) {
|
|
this.setState({
|
|
ascending: value
|
|
});
|
|
}
|
|
|
|
sort(value) {
|
|
this.setState({
|
|
sort: value
|
|
});
|
|
}
|
|
|
|
search(event) {
|
|
this.setState({
|
|
query: event.target.value.toLocaleLowerCase()
|
|
});
|
|
}
|
|
|
|
getProps(addon) {
|
|
return {
|
|
key: this.getName(addon),
|
|
enabled: this.cookie[this.getName(addon)],
|
|
toggle: this.manager.toggle.bind(this.manager),
|
|
//edit: this.edit.bind(this),
|
|
remove: this.delete.bind(this),
|
|
addon: addon,
|
|
hash: addon.hash
|
|
};
|
|
}
|
|
|
|
getString(value) {
|
|
if (!value) return "???";
|
|
return typeof value == "string" ? value : value.toString();
|
|
}
|
|
|
|
getAddons() {
|
|
const sortedAddons = this.props.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(_scroller__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
contentColumn: true,
|
|
fade: true,
|
|
dark: true
|
|
}, 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)), React.createElement(_tools__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
key: "tools"
|
|
}));
|
|
}
|
|
|
|
}
|
|
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];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20"
|
|
}, this.props.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;
|
|
let contentModule = BDModules.get(e => e.contentColumn)[0];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
|
|
style: {
|
|
padding: "60px 40px 0px"
|
|
}
|
|
}, 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/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__);
|
|
/**
|
|
* How the fuck did I do this
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
|
|
let V2C_PresenceSettingsModules;
|
|
class V2C_PresenceSettings extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getSettingGroup("rpc") || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"],
|
|
assets: []
|
|
};
|
|
this.preview = null;
|
|
this.isfetching = false;
|
|
|
|
if (this.state.data.application_id) {
|
|
this.fetchAssets();
|
|
}
|
|
|
|
this.assetComponents = new Set();
|
|
}
|
|
|
|
updateWhenFetched(comp) {
|
|
this.assetComponents.add(comp);
|
|
}
|
|
/**
|
|
*
|
|
* @param {InputText} setting
|
|
*/
|
|
|
|
|
|
onChange(setting, value) {
|
|
let defaultSetting = RPCProps.find(e => e.id === setting.props.id);
|
|
this.setState({
|
|
data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"], this.state.data, {
|
|
[defaultSetting.id]: !!value ? value : null
|
|
}),
|
|
assets: this.state.assets
|
|
});
|
|
|
|
if (setting.props.id === "application_id") {
|
|
this.fetchAssets();
|
|
}
|
|
|
|
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
|
|
this.preview.forceUpdate();
|
|
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
|
|
}
|
|
|
|
fetchAssets() {
|
|
if (this.isfetching === true) {
|
|
let app = this.state.data.application_id;
|
|
setTimeout(() => {
|
|
if (this.state.data.application_id !== app) {
|
|
return;
|
|
}
|
|
|
|
this.fetchAssets();
|
|
}, 5000);
|
|
}
|
|
|
|
if (!this.state.data.application_id) {
|
|
this.setState({
|
|
data: this.state.data,
|
|
assets: []
|
|
});
|
|
this.forceUpdate();
|
|
this.assetComponents.forEach(e => e.forceUpdate());
|
|
return;
|
|
}
|
|
|
|
this.isfetching = true;
|
|
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].fetchAssets(this.state.data.application_id).then(assets => {
|
|
this.isfetching = false;
|
|
this.setState({
|
|
data: this.state.data,
|
|
assets: Object.keys(assets).map(k => {
|
|
let asset = assets[k];
|
|
return {
|
|
id: asset.id,
|
|
name: asset.name,
|
|
type: asset.type
|
|
};
|
|
})
|
|
});
|
|
this.forceUpdate();
|
|
this.assetComponents.forEach(e => e.forceUpdate());
|
|
}).catch(() => {
|
|
this.isfetching = false;
|
|
this.setState({
|
|
data: this.state.data,
|
|
assets: []
|
|
});
|
|
this.forceUpdate();
|
|
this.assetComponents.forEach(e => e.forceUpdate());
|
|
});
|
|
}
|
|
|
|
updatePreview(data) {
|
|
this.setState({
|
|
data
|
|
});
|
|
}
|
|
|
|
get modules() {
|
|
return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [BDModules.get(e => e.contentColumn)[0], BDModules.get(e => e.marginBottom20)[0]]);
|
|
}
|
|
|
|
render() {
|
|
console.log("Rerendering rpc manager");
|
|
let [contentModule, marginModule] = this.modules;
|
|
return React.createElement("div", {
|
|
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
|
|
style: {
|
|
padding: "60px 40px 0px"
|
|
}
|
|
}, React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
title: "RichPresence Settings",
|
|
settings: this.props.settings,
|
|
onChange: this.props.onChange
|
|
}), React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "RichPresence"
|
|
}), React.createElement("div", null, this.optionsComponents), React.createElement("div", 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, {
|
|
text: "Copy current timestamp",
|
|
onClick: () => {
|
|
DiscordNative.clipboard.copy(Date.now() + "");
|
|
},
|
|
color: "brand"
|
|
}) : 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, {
|
|
text: this.props.title,
|
|
onClick: this.props.onClick,
|
|
color: "brand"
|
|
})));
|
|
}
|
|
|
|
}
|
|
|
|
class RpcPreview extends React.Component {
|
|
constructor(props = {}) {
|
|
super(props);
|
|
this.state = {
|
|
active: "profile"
|
|
};
|
|
this.tabs = [];
|
|
this.props.settings.preview = this;
|
|
}
|
|
|
|
changeTab(tab) {
|
|
let ancientTab = this.state.active;
|
|
if (ancientTab === tab.props.id) return;
|
|
this.tabs.forEach(e => {
|
|
e.setActive(false);
|
|
});
|
|
tab.setActive(true);
|
|
this.setState({
|
|
active: tab.props.id
|
|
});
|
|
}
|
|
|
|
render() {
|
|
let preview = new this.preview({
|
|
preview: this
|
|
});
|
|
preview.setState(this.state.rpc);
|
|
return React.createElement("div", {
|
|
className: "lc-tabWrapper"
|
|
}, React.createElement("div", {
|
|
className: "lc-tabnav",
|
|
style: {
|
|
flex: "0 1 auto"
|
|
}
|
|
}, React.createElement(Tab, {
|
|
preview: this,
|
|
title: "Full Profile",
|
|
id: "profile"
|
|
}), React.createElement(Tab, {
|
|
preview: this,
|
|
title: "User Popout",
|
|
id: "popout"
|
|
})), preview.render());
|
|
}
|
|
|
|
isActive(tab) {
|
|
return this.state.active === tab;
|
|
}
|
|
|
|
get preview() {
|
|
if (this.state.active === "profile") return Profile;
|
|
return Popout;
|
|
}
|
|
|
|
}
|
|
|
|
class Tab extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
active: props.preview.isActive(props.id)
|
|
};
|
|
props.preview.tabs.push(this);
|
|
}
|
|
|
|
setActive(isActive) {
|
|
this.setState({
|
|
active: !!isActive
|
|
});
|
|
}
|
|
|
|
render() {
|
|
let className = `lc-navItem`;
|
|
|
|
if (this.state.active) {
|
|
className += ` lc-navItemActive`;
|
|
} else {
|
|
className += ` lc-navItemInactive`;
|
|
}
|
|
|
|
return React.createElement("div", {
|
|
className: className,
|
|
onClick: () => {
|
|
this.props.preview.changeTab(this);
|
|
}
|
|
}, this.props.title);
|
|
}
|
|
|
|
}
|
|
|
|
let popoutModule;
|
|
|
|
class Popout extends React.Component {
|
|
get modules() {
|
|
return popoutModule || (popoutModule = [BDModules.get(e => e.userPopout)[0], BDModules.get(e => e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityUserPopout)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.themeGhostHairlineChannels)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.pro && e.inline)[0], BDModules.get(e => e.colorStandard)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages, BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.default && e.default.getCurrentUser)[0].default]);
|
|
}
|
|
|
|
render() {
|
|
let [rootModule1, flexModule1, stylingModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, protipModule1, colorModule1, Messages, avatarModule1, userModule1] = this.modules;
|
|
let user = userModule1.getCurrentUser();
|
|
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
|
|
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
|
|
timestampClass = timestampClass || activityModule1.timestamp;
|
|
|
|
let images = (() => {
|
|
if (!data["assets.large"]) return null;
|
|
let images = [];
|
|
|
|
if (data["assets.large"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
|
|
class: `${activityModule1.assetsLargeImageUserPopout} ${data["assets.small"] ? activityModule1.assetsLargeMaskUserPopout : ""}`
|
|
}));
|
|
}
|
|
|
|
if (data["assets.small"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
|
|
class: activityModule1.assetsSmallImageUserPopout
|
|
}));
|
|
}
|
|
|
|
if (!images.length) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.assets
|
|
}, images);
|
|
})();
|
|
|
|
return React.createElement("div", {
|
|
className: "lc-userPopout"
|
|
}, React.createElement("div", {
|
|
class: rootModule1.userPopout,
|
|
role: "dialog",
|
|
tabindex: "-1"
|
|
}, React.createElement("div", {
|
|
class: rootModule1.headerPlaying
|
|
}, React.createElement("div", {
|
|
class: `${flexModule1.flex} ${stylingModule1.vertical} ${stylingModule1.justifyCenter} ${stylingModule1.alignCenter} ${stylingModule1.noWrap} ${rootModule1.headerTop}`,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, React.createElement("div", {
|
|
class: rootModule1.avatarWrapperNormal,
|
|
role: "button",
|
|
tabindex: "0"
|
|
}, React.createElement("div", {
|
|
class: avatarModule1,
|
|
role: "img",
|
|
style: {
|
|
width: "80px",
|
|
height: "80px"
|
|
}
|
|
}, React.createElement("svg", {
|
|
width: "92",
|
|
height: "80",
|
|
viewBox: "0 0 92 80",
|
|
class: `${avatarModule1.mask} ${avatarModule1.svg}`
|
|
}, React.createElement("foreignObject", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "80",
|
|
height: "80",
|
|
mask: "url(#svg-mask-avatar-status-round-80)"
|
|
}, React.createElement("img", {
|
|
src: avatarURL,
|
|
alt: " ",
|
|
class: avatarModule1.avatar
|
|
})), React.createElement(Status, null))), React.createElement("svg", {
|
|
width: "80",
|
|
height: "80",
|
|
class: rootModule1.avatarHint,
|
|
viewBox: "0 0 80 80"
|
|
}, React.createElement("foreignObject", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "80",
|
|
height: "80",
|
|
mask: "url(#svg-mask-avatar-status-round-80)"
|
|
}, React.createElement("div", {
|
|
class: rootModule1.avatarHintInner
|
|
}, Messages.VIEW_PROFILE)))), React.createElement("div", {
|
|
class: rootModule1.headerText
|
|
}, React.createElement("div", {
|
|
class: `${flexModule1.flex} ${stylingModule1.horizontal} ${stylingModule1.justifyStart} ${stylingModule1.alignCenter} ${stylingModule1.noWrap}`,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.headerTagNoNickname} ${nameTagModule1.nameTag}`
|
|
}, React.createElement("span", {
|
|
class: `${nameTagModule1.username} ${rootModule1.headerTagUsernameNoNickname}`
|
|
}, user.username), React.createElement("span", null, "#", user.discriminator))))), React.createElement("div", {
|
|
class: `${activityModule1.activityUserPopout} ${rootModule1.activity}`
|
|
}, React.createElement("h3", {
|
|
class: `${activityModule1.headerTextNormal} ${textModule1.base} ${sizeModule1.size12}`
|
|
}, Messages.USER_ACTIVITY_HEADER_PLAYING), React.createElement("div", {
|
|
class: activityModule1.bodyNormal
|
|
}, images, React.createElement("div", {
|
|
class: images ? activityModule1.contentImagesUserPopout : activityModule1.contentNoImagesUserPopout,
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, (() => {
|
|
if (!data.name) return null;
|
|
return React.createElement("h3", {
|
|
class: `${activityModule1.nameNormal} ${textModule1.base} ${sizeModule1.size14}`,
|
|
title: data.name
|
|
}, React.createElement("span", {
|
|
class: activityModule1.activityName
|
|
}, data.name));
|
|
})(), (() => {
|
|
if (!data.details) return null;
|
|
return React.createElement("div", {
|
|
title: data.title,
|
|
class: activityModule1.details
|
|
}, data.details);
|
|
})(), (() => {
|
|
if (!data.state) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.state
|
|
}, React.createElement("span", {
|
|
title: data.state
|
|
}, data.state));
|
|
})(), (() => {
|
|
if (!data["timestamps.start"]) return null;
|
|
let timeComponent = Object(_timestampRender__WEBPACK_IMPORTED_MODULE_6__["default"])(Timestamp, Messages);
|
|
return React.createElement("div", {
|
|
class: activityModule1.timestamp
|
|
}, React.createElement(timeComponent, {
|
|
timestamps: {
|
|
end: null,
|
|
start: data["timestamps.start"]
|
|
}
|
|
}));
|
|
})())))), React.createElement("div", {
|
|
class: `${scrollerModule1.scrollerWrap} ${rootModule1.body} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline} ${scrollerModule1.scrollerFade}`
|
|
}, React.createElement("div", {
|
|
class: `${scrollerModule1.scroller} ${rootModule1.bodyInner}`
|
|
}, React.createElement("div", {
|
|
class: rootModule1.bodyTitle
|
|
}, Messages.NOTE), React.createElement("div", {
|
|
class: `${noteModule1.note} ${rootModule1.note}`
|
|
}, React.createElement("textarea", {
|
|
placeholder: Messages.NOTE_PLACEHOLDER,
|
|
maxlength: "256",
|
|
autocorrect: "off",
|
|
class: BDModules.get(e => e.scrollbarGhostHairline)[0].scrollbarGhostHairline,
|
|
style: {
|
|
height: "36px"
|
|
},
|
|
disabled: true
|
|
})))), React.createElement("div", {
|
|
class: rootModule1.footer
|
|
}, React.createElement("div", {
|
|
class: `${rootModule1.protip} ${protipModule1.inline}`
|
|
}, React.createElement("h3", {
|
|
class: `${protipModule1.pro} ${textModule1.base} ${sizeModule1.size12}`,
|
|
style: {
|
|
color: "rgb(67, 181, 129)"
|
|
}
|
|
}, Messages.PINNED_MESSAGES_PRO_TIP), React.createElement("div", {
|
|
class: `${colorModule1.colorStandard} ${sizeModule1.size14} ${protipModule1.tip}`
|
|
}, Messages.CONTEXT_MENU_HINT)))));
|
|
}
|
|
|
|
}
|
|
|
|
let StatusModules;
|
|
|
|
class Status extends React.Component {
|
|
get modules() {
|
|
return StatusModules || (StatusModules = [BDModules.get(e => e.default && e.default.getPresence)[0], BDModules.get(e => e.pointerEvents)[0].pointerEvents]);
|
|
}
|
|
|
|
render() {
|
|
let [getPresence, pointerEvents] = this.modules;
|
|
let status = getPresence.default.getPresence().status;
|
|
if (status === "invisible") status = "offline";
|
|
return React.createElement("rect", {
|
|
width: "16",
|
|
height: "16",
|
|
x: "60",
|
|
y: "60",
|
|
fill: "#ffffff",
|
|
mask: `url(#svg-mask-status-${status})`,
|
|
className: pointerEvents
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
let timestampClass = "";
|
|
let ProfileModules;
|
|
|
|
class Profile extends React.Component {
|
|
get modules() {
|
|
return ProfileModules || (ProfileModules = [BDModules.get(e => e.flex && e._horizontal)[0], BDModules.get(e => e.vertical && e.alignStretch && !e.streamerModeEnabledBtn)[0], BDModules.get(e => e.topSectionStreaming)[0], BDModules.get(e => e.pointerEvents)[0], BDModules.get(e => e.bot)[0], BDModules.get(e => e.activityProfile)[0], BDModules.get(e => e.muted && e.wrapper && e.base)[0], BDModules.get(e => e.size32)[0], BDModules.get(e => e.scrollerFade)[0], BDModules.get(e => e.note && Object.keys(e).length === 1)[0], BDModules.get(e => e.default && e.default.Messages)[0].default.Messages]);
|
|
}
|
|
|
|
render() {
|
|
let user = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default.getCurrentUser();
|
|
let avatarURL = user.getAvatarURL(user.avatar.startsWith("a_") ? "gif" : "png");
|
|
let [flexModule1, stylingModule1, rootModule1, avatarModule1, nameTagModule1, activityModule1, textModule1, sizeModule1, scrollerModule1, noteModule1, Messages] = this.modules;
|
|
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
|
|
timestampClass = timestampClass || activityModule1.timestamp;
|
|
|
|
let images = (() => {
|
|
if (!data["assets.large"]) return null;
|
|
let images = [];
|
|
|
|
if (data["assets.large"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.large"]}.png`,
|
|
class: `${activityModule1.assetsLargeImageProfile} ${data["assets.small"] ? activityModule1.assetsLargeMaskProfile : ""}`
|
|
}));
|
|
}
|
|
|
|
if (data["assets.small"]) {
|
|
images.push(React.createElement("img", {
|
|
alt: "",
|
|
src: `https://cdn.discordapp.com/app-assets/${data.application_id}/${data["assets.small"]}.png`,
|
|
class: activityModule1.assetsSmallImageProfile
|
|
}));
|
|
}
|
|
|
|
if (!images.length) return null;
|
|
return React.createElement("div", {
|
|
class: activityModule1.assets
|
|
}, images);
|
|
})();
|
|
|
|
return [React.createElement("div", {
|
|
className: "lc-tab"
|
|
}, 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)))))), React.createElement("div", {
|
|
class: "lc- "
|
|
})];
|
|
}
|
|
|
|
}
|
|
|
|
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://cdn.discordapp.com/icons/705908350218666117/05a5652f7d1d0ae328ca7d6e2354a82a.webp",
|
|
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)
|
|
}), _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");
|
|
|
|
|
|
class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
|
|
}, this.props.sections.map(section => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, {
|
|
onChange: this.props.onChange
|
|
}));
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/settingsGroup.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/settingsGroup.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; });
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
|
|
|
|
|
|
|
|
|
|
class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
title,
|
|
settings,
|
|
button
|
|
} = this.props;
|
|
const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
|
|
key: "title-button",
|
|
className: "bd-pfbtn",
|
|
onClick: button.onClick
|
|
}, button.title) : null;
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: title
|
|
}), buttonComponent, settings.map(setting => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
|
id: setting.id,
|
|
key: setting.id,
|
|
data: setting,
|
|
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
|
|
onChange: (id, checked) => {
|
|
this.props.onChange(id, checked);
|
|
}
|
|
});
|
|
})];
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/settingsPanel.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/settingsPanel.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsPanel; });
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
|
|
|
|
|
|
|
|
|
|
class V2C_SettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
settings
|
|
} = this.props;
|
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: columnModule.contentColumn + " " + columnModule.contentColumnDefault + " content-column default"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: this.props.title
|
|
}), this.props.button && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
|
|
key: "title-button",
|
|
className: "bd-pfbtn",
|
|
onClick: this.props.button.onClick
|
|
}, this.props.button.title), settings.map(setting => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
|
id: setting.id,
|
|
key: setting.id,
|
|
data: setting,
|
|
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
|
|
onChange: (id, checked) => {
|
|
this.props.onChange(id, checked);
|
|
}
|
|
});
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/settingsTitle.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/settingsTitle.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
} //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20
|
|
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20 " + BDModules.get(e => e.marginTop60)[0].marginTop60
|
|
}, this.props.text);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/sidebar.js":
|
|
/*!***************************!*\
|
|
!*** ./src/ui/sidebar.js ***!
|
|
\***************************/
|
|
/*! exports provided: default, setUnselected */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SideBar; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setUnselected", function() { return setUnselected; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tabBarSeparator */ "./src/ui/tabBarSeparator.js");
|
|
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tabBarHeader */ "./src/ui/tabBarHeader.js");
|
|
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tabBarItem */ "./src/ui/tabBarItem.js");
|
|
|
|
|
|
|
|
|
|
class V2C_SideBar extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
const si = document.querySelector("[class*=side-] > [class*=selected]");
|
|
if (si) this.scn = si.className;
|
|
const ns = document.querySelector("[class*=side-] > [class*='item-']:not([class*=selected])");
|
|
if (ns) this.nscn = ns.className;
|
|
const tabs = document.querySelectorAll("[class*='side-'] > [class*='item-']");
|
|
|
|
for (const element of tabs) {
|
|
element.addEventListener("click", () => {
|
|
this.setState({
|
|
selected: null
|
|
});
|
|
});
|
|
}
|
|
|
|
this.setInitialState();
|
|
this.onClick = this.onClick.bind(this);
|
|
this.setSelected = this.setSelected.bind(this);
|
|
sidebars.push(this);
|
|
}
|
|
|
|
setInitialState() {
|
|
const self = this;
|
|
self.state = {
|
|
selected: null,
|
|
items: self.props.items
|
|
};
|
|
const initialSelection = self.props.items.find(item => {
|
|
return item.selected;
|
|
});
|
|
|
|
if (initialSelection) {
|
|
self.state.selected = initialSelection.id;
|
|
}
|
|
}
|
|
|
|
render() {
|
|
const self = this;
|
|
const {
|
|
headerText
|
|
} = self.props;
|
|
const {
|
|
items,
|
|
selected
|
|
} = self.state;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_1__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: headerText,
|
|
button: this.props.headerButton
|
|
}), items.map(item => {
|
|
const {
|
|
id,
|
|
text
|
|
} = item;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
|
key: id,
|
|
selected: selected === id,
|
|
text: text,
|
|
id: id,
|
|
onClick: self.onClick
|
|
});
|
|
}));
|
|
}
|
|
|
|
setSelected(e) {
|
|
e.target.className = this.scn;
|
|
}
|
|
|
|
onClick(id) {
|
|
const si = document.querySelector("[class*=side] > [class*=selected]");
|
|
|
|
if (si) {
|
|
si.removeEventListener("click", this.setSelected);
|
|
si.addEventListener("click", this.setSelected);
|
|
si.className = this.nscn;
|
|
}
|
|
|
|
setUnselected();
|
|
this.setState({
|
|
selected: id
|
|
});
|
|
if (this.props.onClick) this.props.onClick(id);
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
let sidebarIndex = sidebars.findIndex(e => e === this);
|
|
if (sidebarIndex) sidebars.splice(sidebarIndex, 1);
|
|
}
|
|
|
|
}
|
|
const sidebars = [];
|
|
function setUnselected() {
|
|
sidebars.forEach(sidebar => {
|
|
if (!sidebar.state.selected) return;
|
|
sidebar.setState({
|
|
selected: null
|
|
});
|
|
});
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/switch.js":
|
|
/*!**************************!*\
|
|
!*** ./src/ui/switch.js ***!
|
|
\**************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
|
|
|
|
|
|
class SwitchItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.onChange = this.onChange.bind(this);
|
|
}
|
|
|
|
onChange() {
|
|
this.props.checked = !this.props.checked;
|
|
this.props.onChange(this.props.id, this.props.checked);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
text,
|
|
info
|
|
} = this.props.data;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-flex flex-vertical flex-justify-start flex-align-stretch flex-nowrap ui-switch-item"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-flex flex-horizontal flex-justify-start flex-align-stretch flex-nowrap"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h3", {
|
|
className: "ui-form-title h3 margin-reset margin-reset ui-flex-child"
|
|
}, text), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_components_switch__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
onChange: this.onChange,
|
|
checked: this.props.checked
|
|
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-form-text style-description margin-top-4",
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, info));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/tabBarHeader.js":
|
|
/*!********************************!*\
|
|
!*** ./src/ui/tabBarHeader.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarHeader; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_TabBarHeader extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar-header"
|
|
}, this.props.text, this.props.button);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/tabBarItem.js":
|
|
/*!******************************!*\
|
|
!*** ./src/ui/tabBarItem.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarItem; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_TabBarItem extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.setInitialState();
|
|
this.onClick = this.onClick.bind(this);
|
|
}
|
|
|
|
setInitialState() {
|
|
this.state = {
|
|
selected: this.props.selected || false
|
|
};
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: `ui-tab-bar-item${this.props.selected ? " selected" : ""}`,
|
|
onClick: this.onClick
|
|
}, this.props.text);
|
|
}
|
|
|
|
onClick() {
|
|
if (this.props.onClick) {
|
|
this.props.onClick(this.props.id);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/tabBarSeparator.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/ui/tabBarSeparator.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_TabBarSeparator; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_TabBarSeparator extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar-separator margin-top-8 margin-bottom-8"
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/timestampRender.js":
|
|
/*!***********************************!*\
|
|
!*** ./src/ui/timestampRender.js ***!
|
|
\***********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
|
|
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react;
|
|
const intervalModule1 = BDModules.get(e => e.Interval)[0];
|
|
/* harmony default export */ __webpack_exports__["default"] = (function (component, Messages) {
|
|
class TimeRender extends React.PureComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this._interval = new intervalModule1.Interval();
|
|
this.state = Object.assign({}, this.getUpdatedTime());
|
|
}
|
|
|
|
componentDidMount() {
|
|
let self = this;
|
|
|
|
this._interval.start(1e3, function () {
|
|
return self.setState(self.getUpdatedTime());
|
|
});
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this._interval.stop();
|
|
}
|
|
|
|
componentDidUpdate(activity) {
|
|
if (activity.timestamps.end === this.props.timestamps.end && activity.timestamps.start === this.props.timestamps.start) return;
|
|
this.setState(this.getUpdatedTime());
|
|
}
|
|
|
|
getUpdatedTime() {
|
|
let timestamps = this.props.timestamps;
|
|
let now = Date.now() / 1e3;
|
|
|
|
if (null != timestamps.end) {
|
|
return this.getDiff(now, checkUnix(timestamps.end) / 1e3);
|
|
}
|
|
|
|
if (null != timestamps.start) {
|
|
return this.getDiff(checkUnix(timestamps.start) / 1e3, now);
|
|
}
|
|
|
|
return {
|
|
hours: 0,
|
|
minutes: 0,
|
|
seconds: 0
|
|
};
|
|
}
|
|
|
|
renderTime(number, removeZero) {
|
|
if (removeZero === undefined) removeZero = false;
|
|
if (removeZero && number <= 0) return -1;
|
|
if (number < 10) return "0" + number;
|
|
return number;
|
|
}
|
|
|
|
getDiff(timestamp, now) {
|
|
let hours = Math.max(now - timestamp, 0);
|
|
let seconds = Math.floor(hours) % 60;
|
|
let minutes = Math.floor(hours / 60) % 60;
|
|
return {
|
|
hours: Math.floor(hours / 3600) % 24,
|
|
minutes,
|
|
seconds
|
|
};
|
|
}
|
|
|
|
render() {
|
|
let props = this.props;
|
|
let timestamps = props.timestamps;
|
|
|
|
let usedProps = function (props, items) {
|
|
if (null == props) return {};
|
|
let timestamps = {};
|
|
let keys = Object.keys(props);
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
let key = keys[i];
|
|
|
|
if (!items.indexOf(key) >= 0) {
|
|
timestamps[key] = props[key];
|
|
}
|
|
}
|
|
|
|
return timestamps;
|
|
}(props, ["timestamps"]);
|
|
|
|
let state = this.state;
|
|
let hours = state.hours;
|
|
let minutes = state.minutes;
|
|
let seconds = state.seconds;
|
|
let data = {
|
|
hours: this.renderTime(hours, !0),
|
|
minutes: this.renderTime(minutes),
|
|
seconds: this.renderTime(seconds)
|
|
};
|
|
|
|
if (timestamps.end !== null) {
|
|
return React.createElement(component, Object.assign({}, usedProps, {
|
|
message: Messages.USER_ACTIVITY_TIMESTAMP_END.format(data)
|
|
}));
|
|
}
|
|
|
|
if (timestamps.start !== null) {
|
|
return React.createElement(component, Object.assign({}, usedProps, {
|
|
message: Messages.USER_ACTIVITY_TIMESTAMP_START.format(data)
|
|
}));
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
}
|
|
|
|
return TimeRender;
|
|
});
|
|
;
|
|
|
|
function checkUnix(e) {
|
|
return ("" + e).length < 13 ? 1e3 * e : e;
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/tools.js":
|
|
/*!*************************!*\
|
|
!*** ./src/ui/tools.js ***!
|
|
\*************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Tools; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _xSvg__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./xSvg */ "./src/ui/xSvg.js");
|
|
|
|
|
|
class V2C_Tools extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.onClick = this.onClick.bind(this);
|
|
}
|
|
|
|
render() {
|
|
let toolsModule = BDModules.get(e => e.toolsContainer)[0];
|
|
let containerModule = BDModules.get(e => e.container && e.closeButton && e.closeButtonBold)[0];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "tools-container " + toolsModule.toolsContainer
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "tools " + toolsModule.tools
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: containerModule.container
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "btn-close " + containerModule.closeButton,
|
|
onClick: this.onClick
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_xSvg__WEBPACK_IMPORTED_MODULE_1__["default"], null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "esc-text " + containerModule.keybind
|
|
}, "ESC"))));
|
|
}
|
|
|
|
onClick() {
|
|
if (this.props.onClick) {
|
|
this.props.onClick();
|
|
}
|
|
|
|
const closeButton = document.querySelector("." + BDModules.get(e => e.closeButton && e.keybindBold)[0].closeButton.split(" ")[0]);
|
|
if (closeButton) closeButton.click();
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/tooltip.js":
|
|
/*!***************************!*\
|
|
!*** ./src/ui/tooltip.js ***!
|
|
\***************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EmulatedTooltip; });
|
|
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
|
|
/**
|
|
* Tooltip that automatically show and hide themselves on mouseenter and mouseleave events.
|
|
* Will also remove themselves if the node to watch is removed from DOM through
|
|
* a MutationObserver.
|
|
*
|
|
* Note this is not using Discord's internals but normal DOM manipulation and emulates
|
|
* Discord's own tooltips as closely as possible.
|
|
*
|
|
* @module EmulatedTooltip
|
|
* @version 0.0.1
|
|
*/
|
|
|
|
//<div class="layer-v9HyYc disabledPointerEvents-1ptgTB" style="position: absolute; left: 237px; bottom: 51px;">
|
|
// <div class="tooltip-2QfLtc tooltipTop-XDDSxx tooltipBlack-PPG47z tooltipDisablePointerEvents-3eaBGN" style="opacity: 1; transform: none;">
|
|
// <div class="tooltipPointer-3ZfirK"></div>
|
|
// <div class="tooltipContent-bqVLWK">User Settings</div>
|
|
// </div>
|
|
//</div>
|
|
//<div class="layer-v9HyYc" style="top: 860px; left: 632.5px;">
|
|
// <div class="tooltip-2QfLtc tooltipBlack-PPG47z tooltipTop-XDDSxx">
|
|
// <div class="tooltipPointer-3ZfirK"></div>
|
|
// Changelog
|
|
// </div>
|
|
//</div>
|
|
|
|
let TooltipClasses;
|
|
|
|
function getTooltipClasses() {
|
|
if (TooltipClasses) return TooltipClasses;
|
|
return TooltipClasses = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("tooltip", "tooltipBlack");
|
|
}
|
|
|
|
let TooltipLayers;
|
|
|
|
function getTooltipLayers() {
|
|
if (TooltipLayers) return TooltipLayers;
|
|
return TooltipLayers = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("layer", "layerContainer");
|
|
}
|
|
|
|
const getClass = function (sideOrColor) {
|
|
const upperCase = sideOrColor[0].toUpperCase() + sideOrColor.slice(1);
|
|
const tooltipClass = getTooltipClasses()[`tooltip${upperCase}`];
|
|
if (tooltipClass) return tooltipClass;
|
|
return null;
|
|
};
|
|
|
|
const classExists = function (sideOrColor) {
|
|
return getClass(sideOrColor) ? true : false;
|
|
};
|
|
|
|
const toPx = function (value) {
|
|
return `${value}px`;
|
|
};
|
|
/* <div class="layer-v9HyYc da-layer" style="left: 234.5px; bottom: 51px;">
|
|
<div class="tooltip-2QfLtc da-tooltip tooltipTop-XDDSxx tooltipBlack-PPG47z">
|
|
<div class="tooltipPointer-3ZfirK da-tooltipPointer"></div>
|
|
User Settings
|
|
</div>
|
|
</div> */
|
|
|
|
|
|
class EmulatedTooltip {
|
|
/**
|
|
*
|
|
* @constructor
|
|
* @param {(HTMLElement|jQuery)} node - DOM node to monitor and show the tooltip on
|
|
* @param {string} tip - string to show in the tooltip
|
|
* @param {object} options - additional options for the tooltip
|
|
* @param {string} [options.style=black] - correlates to the discord styling/colors (black, brand, green, grey, red, yellow)
|
|
* @param {string} [options.side=top] - can be any of top, right, bottom, left
|
|
* @param {boolean} [options.preventFlip=false] - prevents moving the tooltip to the opposite side if it is too big or goes offscreen
|
|
* @param {boolean} [options.disabled=false] - whether the tooltip should be disabled from showing on hover
|
|
*/
|
|
constructor(node, text, options = {}) {
|
|
const {
|
|
style = "black",
|
|
side = "top",
|
|
preventFlip = false,
|
|
disabled = false
|
|
} = options;
|
|
this.node = node instanceof jQuery ? node[0] : node;
|
|
this.label = text;
|
|
this.style = style.toLowerCase();
|
|
this.side = side.toLowerCase();
|
|
this.preventFlip = preventFlip;
|
|
this.disabled = disabled;
|
|
if (!classExists(this.side)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Side ${this.side} does not exist.`);
|
|
if (!classExists(this.style)) return _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].err("EmulatedTooltip", `Style ${this.style} does not exist.`);
|
|
this.element = document.createElement("div");
|
|
this.element.className = getTooltipLayers().layer + " " + getTooltipLayers().disabledPointerEvents;
|
|
this.tooltipElement = document.createElement("div");
|
|
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
|
|
this.labelElement = document.createElement("div");
|
|
this.labelElement.className = getTooltipClasses().tooltipContent;
|
|
const pointerElement = document.createElement("div");
|
|
pointerElement.className = getTooltipClasses().tooltipPointer;
|
|
this.tooltipElement.append(pointerElement);
|
|
this.tooltipElement.append(this.labelElement);
|
|
this.element.append(this.tooltipElement);
|
|
this.node.addEventListener("mouseenter", () => {
|
|
if (this.disabled) return;
|
|
this.show();
|
|
const observer = new MutationObserver(mutations => {
|
|
mutations.forEach(mutation => {
|
|
const nodes = Array.from(mutation.removedNodes);
|
|
const directMatch = nodes.indexOf(this.node) > -1;
|
|
const parentMatch = nodes.some(parent => parent.contains(this.node));
|
|
|
|
if (directMatch || parentMatch) {
|
|
this.hide();
|
|
observer.disconnect();
|
|
}
|
|
});
|
|
});
|
|
observer.observe(document.body, {
|
|
subtree: true,
|
|
childList: true
|
|
});
|
|
});
|
|
this.node.addEventListener("mouseleave", () => {
|
|
this.hide();
|
|
});
|
|
}
|
|
/** Container where the tooltip will be appended. */
|
|
|
|
|
|
get container() {
|
|
return document.querySelector("." + BDModules.get(e => e.popouts)[0].popouts.split(" ")[0] + " ~ ." + BDModules.get(e => e.layerContainer)[0].layerContainer.split(" ")[0]);
|
|
}
|
|
/** Boolean representing if the tooltip will fit on screen above the element */
|
|
|
|
|
|
get canShowAbove() {
|
|
return this.node.getBoundingClientRect().top - this.element.offsetHeight >= 0;
|
|
}
|
|
/** Boolean representing if the tooltip will fit on screen below the element */
|
|
|
|
|
|
get canShowBelow() {
|
|
return this.node.getBoundingClientRect().top + this.node.offsetHeight + this.element.offsetHeight <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenHeight;
|
|
}
|
|
/** Boolean representing if the tooltip will fit on screen to the left of the element */
|
|
|
|
|
|
get canShowLeft() {
|
|
return this.node.getBoundingClientRect().left - this.element.offsetWidth >= 0;
|
|
}
|
|
/** Boolean representing if the tooltip will fit on screen to the right of the element */
|
|
|
|
|
|
get canShowRight() {
|
|
return this.node.getBoundingClientRect().left + this.node.offsetWidth + this.element.offsetWidth <= _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].screenWidth;
|
|
}
|
|
/** Hides the tooltip. Automatically called on mouseleave. */
|
|
|
|
|
|
hide() {
|
|
this.element.remove();
|
|
this.tooltipElement.className = this._className;
|
|
}
|
|
/** Shows the tooltip. Automatically called on mouseenter. Will attempt to flip if position was wrong. */
|
|
|
|
|
|
show() {
|
|
this.tooltipElement.className = `${getTooltipClasses().tooltip} ${getClass(this.style)}`;
|
|
this.labelElement.textContent = this.label;
|
|
this.container.append(this.element);
|
|
|
|
if (this.side == "top") {
|
|
if (this.canShowAbove || !this.canShowAbove && this.preventFlip) this.showAbove();else this.showBelow();
|
|
}
|
|
|
|
if (this.side == "bottom") {
|
|
if (this.canShowBelow || !this.canShowBelow && this.preventFlip) this.showBelow();else this.showAbove();
|
|
}
|
|
|
|
if (this.side == "left") {
|
|
if (this.canShowLeft || !this.canShowLeft && this.preventFlip) this.showLeft();else this.showRight();
|
|
}
|
|
|
|
if (this.side == "right") {
|
|
if (this.canShowRight || !this.canShowRight && this.preventFlip) this.showRight();else this.showLeft();
|
|
}
|
|
}
|
|
/** Force showing the tooltip above the node. */
|
|
|
|
|
|
showAbove() {
|
|
this.tooltipElement.classList.add(getClass("top"));
|
|
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top - this.element.offsetHeight - 10));
|
|
this.centerHorizontally();
|
|
}
|
|
/** Force showing the tooltip below the node. */
|
|
|
|
|
|
showBelow() {
|
|
this.tooltipElement.classList.add(getClass("bottom"));
|
|
this.element.style.setProperty("top", toPx(this.node.getBoundingClientRect().top + this.node.offsetHeight + 10));
|
|
this.centerHorizontally();
|
|
}
|
|
/** Force showing the tooltip to the left of the node. */
|
|
|
|
|
|
showLeft() {
|
|
this.tooltipElement.classList.add(getClass("left"));
|
|
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left - this.element.offsetWidth - 10));
|
|
this.centerVertically();
|
|
}
|
|
/** Force showing the tooltip to the right of the node. */
|
|
|
|
|
|
showRight() {
|
|
this.tooltipElement.classList.add(getClass("right"));
|
|
this.element.style.setProperty("left", toPx(this.node.getBoundingClientRect().left + this.node.offsetWidth + 10));
|
|
this.centerVertically();
|
|
}
|
|
|
|
centerHorizontally() {
|
|
const nodecenter = this.node.getBoundingClientRect().left + this.node.offsetWidth / 2;
|
|
this.element.style.setProperty("left", toPx(nodecenter - this.element.offsetWidth / 2));
|
|
}
|
|
|
|
centerVertically() {
|
|
const nodecenter = this.node.getBoundingClientRect().top + this.node.offsetHeight / 2;
|
|
this.element.style.setProperty("top", toPx(nodecenter - this.element.offsetHeight / 2));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/tooltipWrap.js":
|
|
/*!*******************************!*\
|
|
!*** ./src/ui/tooltipWrap.js ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.js");
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (class extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
async componentDidMount() {
|
|
const {
|
|
style = "black",
|
|
side = "top",
|
|
text = ""
|
|
} = this.props;
|
|
this.node = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.findDOMNode(this);
|
|
this.tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_1__["default"](this.node, text, {
|
|
style,
|
|
side
|
|
});
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this.tooltip.hide();
|
|
delete this.tooltip;
|
|
}
|
|
|
|
render() {
|
|
return this.props.children;
|
|
}
|
|
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/xSvg.js":
|
|
/*!************************!*\
|
|
!*** ./src/ui/xSvg.js ***!
|
|
\************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_XSvg; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_XSvg extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
viewBox: "0 0 12 12",
|
|
style: {
|
|
width: "18px",
|
|
height: "18px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", {
|
|
className: "background",
|
|
fill: "none",
|
|
fillRule: "evenodd"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
d: "M0 0h12v12H0"
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
className: "fill",
|
|
fill: "#dcddde",
|
|
d: "M9.5 3.205L8.795 2.5 6 5.295 3.205 2.5l-.705.705L5.295 6 2.5 8.795l.705.705L6 6.705 8.795 9.5l.705-.705L6.705 6"
|
|
})));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "crypto":
|
|
/*!*************************!*\
|
|
!*** external "crypto" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("crypto");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "electron":
|
|
/*!***************************!*\
|
|
!*** external "electron" ***!
|
|
\***************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("electron");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "events":
|
|
/*!*************************!*\
|
|
!*** external "events" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("events");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fs":
|
|
/*!*********************!*\
|
|
!*** external "fs" ***!
|
|
\*********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("fs");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "mkdirp":
|
|
/*!*************************!*\
|
|
!*** external "mkdirp" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("mkdirp");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "module":
|
|
/*!*************************!*\
|
|
!*** external "module" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("module");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "node-fetch":
|
|
/*!*****************************!*\
|
|
!*** external "node-fetch" ***!
|
|
\*****************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("node-fetch");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "path":
|
|
/*!***********************!*\
|
|
!*** external "path" ***!
|
|
\***********************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("path");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "request":
|
|
/*!**************************!*\
|
|
!*** external "request" ***!
|
|
\**************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("request");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "rimraf":
|
|
/*!*************************!*\
|
|
!*** external "rimraf" ***!
|
|
\*************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("rimraf");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "yauzl":
|
|
/*!************************!*\
|
|
!*** external "yauzl" ***!
|
|
\************************/
|
|
/*! no static exports found */
|
|
/***/ (function(module, exports) {
|
|
|
|
module.exports = require("yauzl");
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3JlYWN0RGV2VG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3NldHRpbmdzUGFuZWxTaWRlYmFyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy90aGVtZU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdXRpbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3YyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy92b2ljZU1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL0xpZ2h0Y29yZFVzZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2J1Z19odW50ZXIuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvc3ZnL2xpZ2h0Y29yZC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9BY2NvdW50SW5mb3MuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wcmVzZW5jZVNldHRpbmdzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3B1YmxpY1NlcnZlcnMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NlcnZlckNhcmQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL3NpZGViYXJWaWV3LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcmVsb2FkSWNvbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Njcm9sbGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NldHRpbmdzR3JvdXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc1BhbmVsLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NUaXRsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NpZGViYXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zd2l0Y2guanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJIZWFkZXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJJdGVtLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGFiQmFyU2VwYXJhdG9yLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdGltZXN0YW1wUmVuZGVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvdG9vbHRpcFdyYXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS94U3ZnLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZWxlY3Ryb25cIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZXZlbnRzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImZzXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm1rZGlycFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJtb2R1bGVcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibm9kZS1mZXRjaFwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJwYXRoXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInJlcXVlc3RcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicmltcmFmXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcInlhdXpsXCIiXSwibmFtZXMiOlsibWluaW11bURpc2NvcmRWZXJzaW9uIiwiY3VycmVudERpc2NvcmRWZXJzaW9uIiwid2luZG93IiwiRGlzY29yZE5hdGl2ZSIsInJlbW90ZUFwcCIsImdldFZlcnNpb24iLCJtaW5TdXBwb3J0ZWRWZXJzaW9uIiwiYmJkVmVyc2lvbiIsIkxDQ2hhbmVsb2ciLCJkZXNjcmlwdGlvbiIsImNoYW5nZXMiLCJ0aXRsZSIsIml0ZW1zIiwiaW1hZ2UiLCJzdWJ0aXRsZSIsInJlbW90ZSIsImdldEdsb2JhbCIsInZlcnNpb24iLCJmb290ZXIiLCJUZXh0RWxlbWVudCIsIldlYnBhY2tNb2R1bGVzIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJNb2RhbFN0YWNrIiwiZmluZEJ5UHJvcHMiLCJBbmNob3IiLCJmaW5kIiwibSIsImRpc3BsYXlOYW1lIiwiQW5jaG9yQ2xhc3NlcyIsImFuY2hvciIsImFuY2hvclVuZGVybGluZU9uSG92ZXIiLCJqb2luU3VwcG9ydFNlcnZlciIsImNsaWNrIiwicHJldmVudERlZmF1bHQiLCJzdG9wUHJvcGFnYXRpb24iLCJwb3AiLCJCRFYyIiwiam9pbkxDIiwic3VwcG9ydExpbmsiLCJSZWFjdCIsImNyZWF0ZUVsZW1lbnQiLCJvbkNsaWNrIiwiY2xhc3NOYW1lIiwic2l6ZSIsIlNpemVzIiwiU01BTEwiLCJjb2xvciIsIkNvbG9ycyIsIlNUQU5EQVJEIiwiYmJkQ2hhbmdlbG9nIiwidHlwZSIsInNldHRpbmdzIiwiaWQiLCJpbmZvIiwiaW1wbGVtZW50ZWQiLCJoaWRkZW4iLCJjYXQiLCJjYXRlZ29yeSIsImRlZmF1bHRDb29raWUiLCJzZXR0aW5nc0Nvb2tpZSIsInNldHRpbmdzUlBDIiwiZGVmYXVsdFJQQyIsIkRhdGUiLCJub3ciLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwicGx1Z2luTW9kdWxlIiwidGhlbWVNb2R1bGUiLCJCREV2ZW50cyIsInNldHRpbmdzUGFuZWwiLCJEYXRhU3RvcmUiLCJDb250ZW50TWFuYWdlciIsIkNsYXNzTm9ybWFsaXplciIsIkJkQXBpIiwiQ29yZSIsIkNvcmVXcmFwcGVyIiwiY29uc3RydWN0b3IiLCJzZXRDb25maWciLCJpbml0IiwicmVxdWlyZSIsInYyTG9hZGVyIiwiZG9jdW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwiRGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiQWN0aW9uVHlwZXMiLCJzb2NrZXRJZCIsInBpZCIsInByb2Nlc3MiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIlJlYWN0RE9NIiwiUmVhY3REb20iLCJSZWFjdENvbXBvbmVudCIsIldpbmRvd0NvbmZpZ0ZpbGUiLCJlbW90ZXMiLCJzY3JlZW5XaWR0aCIsIk1hdGgiLCJtYXgiLCJkb2N1bWVudEVsZW1lbnQiLCJjbGllbnRXaWR0aCIsImlubmVyV2lkdGgiLCJzY3JlZW5IZWlnaHQiLCJjbGllbnRIZWlnaHQiLCJpbm5lckhlaWdodCIsImdldEFsbFdpbmRvd1ByZWZlcmVuY2VzIiwiZ2V0V2luZG93UHJlZmVyZW5jZSIsInNldFdpbmRvd1ByZWZlcmVuY2UiLCJpbmplY3RDU1MiLCJjc3MiLCJET00iLCJhZGRTdHlsZSIsImVzY2FwZUlEIiwiY2xlYXJDU1MiLCJyZW1vdmVTdHlsZSIsImxpbmtKUyIsImFkZFNjcmlwdCIsInVubGlua0pTIiwicmVtb3ZlU2NyaXB0IiwiZ2V0UGx1Z2luIiwiaGFzT3duUHJvcGVydHkiLCJwbHVnaW4iLCJnZXRDb3JlIiwibWFpbkNvcmUiLCJhbGVydCIsInNob3dDb25maXJtYXRpb25Nb2RhbCIsImNhbmNlbFRleHQiLCJvcHRpb25zIiwiZmluZE1vZHVsZSIsImZpbHRlciIsImZpbmRBbGxNb2R1bGVzIiwiZmluZEFsbCIsImZpbmRNb2R1bGVCeVByb3BzIiwicHJvcHMiLCJmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzIiwiZmluZE1vZHVsZUJ5UHJvdG90eXBlcyIsInByb3RvcyIsImZpbmRCeVByb3RvdHlwZXMiLCJmaW5kTW9kdWxlQnlEaXNwbGF5TmFtZSIsImdldEludGVybmFsSW5zdGFuY2UiLCJub2RlIiwialF1ZXJ5IiwiRWxlbWVudCIsImxvYWREYXRhIiwicGx1Z2luTmFtZSIsImdldFBsdWdpbkRhdGEiLCJnZXREYXRhIiwic2F2ZURhdGEiLCJzZXRQbHVnaW5EYXRhIiwic2V0RGF0YSIsImRlbGV0ZURhdGEiLCJkZWxldGVQbHVnaW5EYXRhIiwid2hhdCIsIm1ldGhvZE5hbWUiLCJvblJlbW92ZWQiLCJjYWxsYmFjayIsInN1cHByZXNzRXJyb3JzIiwibWV0aG9kIiwidGVzdEpTT04iLCJpc1BsdWdpbkVuYWJsZWQiLCJpc1RoZW1lRW5hYmxlZCIsImlzU2V0dGluZ0VuYWJsZWQiLCJlbmFibGVTZXR0aW5nIiwib25DaGFuZ2UiLCJkaXNhYmxlU2V0dGluZyIsInRvZ2dsZVNldHRpbmciLCJnZXRCRERhdGEiLCJzZXRCRERhdGEiLCJtYWtlQWRkb25BUEkiLCJjb29raWUiLCJsaXN0IiwibWFuYWdlciIsIkFkZG9uQVBJIiwiZm9sZGVyIiwiaXNFbmFibGVkIiwidG9nZ2xlIiwicmVsb2FkIiwiZ2V0QWxsIiwiayIsImEiLCJQbHVnaW5zIiwiVGhlbWVzIiwiRXZlbnRFbWl0dGVyIiwiZXZlbnROYW1lIiwiYXJncyIsImVtaXQiLCJvZmYiLCJldmVudEFjdGlvbiIsInJlbW92ZUxpc3RlbmVyIiwic2VsZWN0b3JzIiwicmVtb3ZlRGEiLCJnZXRTZWxlY3RvcnMiLCJzdGFuZGFyZFNpZGViYXJWaWV3IiwiZGVmYXVsdENsYXNzTmFtZSIsInNlbGVjdHMiLCJwdXNoIiwicGF5bWVudFNvdXJjZVJvdyIsInN1YlRleHQiLCJkZXNjcmlwdGlvbldyYXBwZXIiLCJ1c2VyU2V0dGluZ3NBY2NvdW50Iiwidmlld0JvZHkiLCJCbHVyUHJpdmF0ZSIsImVycm9yIiwiRE9NVG9vbHMiLCJub3JtYWxpemVkUHJlZml4IiwicmFuZENsYXNzIiwic3RvcCIsImhhc1BhdGNoZWQiLCJ1bnBhdGNoQ2xhc3NNb2R1bGVzIiwibW9kdWxlRmlsdGVyIiwicmV2ZXJ0RWxlbWVudCIsInF1ZXJ5U2VsZWN0b3IiLCJwYXRjaENsYXNzTW9kdWxlcyIsIm5vcm1hbGl6ZUVsZW1lbnQiLCJwYXRjaERPTU1ldGhvZHMiLCJtb2R1bGVzIiwibW9kdWxlIiwicGF0Y2hDbGFzc01vZHVsZSIsInVucGF0Y2hDbGFzc01vZHVsZSIsInNob3VsZElnbm9yZSIsImlzTmFOIiwiZW5kc1dpdGgiLCJzdGFydHNXaXRoIiwiQXJyYXkiLCJpc0FycmF5IiwiX19lc01vZHVsZSIsImJhc2VDbGFzc05hbWUiLCJzcGxpdCIsImNvbXBvbmVudE5hbWUiLCJjbGFzc05hbWVzIiwiY2xhc3NMaXN0Iiwibm9ybWFsQ2xhc3MiLCJjYW1lbENhc2UiLCJzIiwiaSIsInRvVXBwZXJDYXNlIiwic2xpY2UiLCJqb2luIiwibmV3U3RyaW5nIiwidHJpbSIsImVsZW1lbnQiLCJjbGFzc2VzIiwiYyIsImNsZW4iLCJuZXdDbGFzcyIsImFkZCIsImNoaWxkIiwiY2hpbGRyZW4iLCJuZXh0RWxlbWVudFNpYmxpbmciLCJ0b1JlbW92ZSIsInJlbW92ZSIsImNvbnRhaW5zIiwiRE9NVG9rZW5MaXN0IiwidG9rZW4iLCJ0b2tlbnMiLCJ0IiwiQ29sb3JlZFRleHQiLCJpbmplY3RDb2xvcmVkVGV4dCIsImNhbmNlbENvbG9yZWRUZXh0IiwiTWVzc2FnZUNvbXBvbmVudCIsImJlZm9yZSIsIm1ldGhvZEFyZ3VtZW50cyIsImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQiLCJtZXNzYWdlQ29udGVudCIsIm9yaWdpbmFsVHlwZSIsIl9fb3JpZ2luYWxNZXRob2QiLCJyb2xlQ29sb3IiLCJjb2xvclN0cmluZyIsInN0eWxlIiwiYXNzaWduIiwicmVtb3ZlQ29sb3JlZFRleHQiLCJjbGFzc05hbWVNYXJrdXAiLCJtYXJrdXAiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsImVsZW0iLCJzZXRQcm9wZXJ0eSIsInBhdGgiLCJmcyIsIk1vZHVsZSIsImdsb2JhbFBhdGhzIiwicmVzb2x2ZSIsImFwcCIsImdldEFwcFBhdGgiLCJNZXRhRXJyb3IiLCJvcmlnaW5hbEpTUmVxdWlyZSIsIl9leHRlbnNpb25zIiwib3JpZ2luYWxDU1NSZXF1aXJlIiwic3BsaXRSZWdleCIsImVzY2FwZWRBdFJlZ2V4IiwidGltZUNhY2hlIiwid2F0Y2hlcnMiLCJnZXRDb250ZW50UmVxdWlyZSIsInBsdWdpbnNGb2xkZXIiLCJfcGx1Z2luc0ZvbGRlciIsInJlYWxwYXRoU3luYyIsImRhdGFQYXRoIiwidGhlbWVzRm9sZGVyIiwiX3RoZW1lc0ZvbGRlciIsIndhdGNoQ29udGVudCIsImNvbnRlbnRUeXBlIiwiaXNQbHVnaW4iLCJiYXNlRm9sZGVyIiwiZmlsZUVuZGluZyIsIndhdGNoIiwicGVyc2lzdGVudCIsImV2ZW50VHlwZSIsImZpbGVuYW1lIiwiUHJvbWlzZSIsInIiLCJzZXRUaW1lb3V0Iiwic3RhdFN5bmMiLCJlcnIiLCJjb2RlIiwidW5sb2FkUGx1Z2luIiwidW5sb2FkVGhlbWUiLCJpc0ZpbGUiLCJzdGF0cyIsIm10aW1lIiwiZ2V0VGltZSIsImxvYWRQbHVnaW4iLCJsb2FkVGhlbWUiLCJyZWxvYWRQbHVnaW4iLCJyZWxvYWRUaGVtZSIsInVud2F0Y2hDb250ZW50IiwiY2xvc2UiLCJleHRyYWN0TWV0YSIsImZpcnN0TGluZSIsImhhc09sZE1ldGEiLCJwYXJzZU9sZE1ldGEiLCJoYXNOZXdNZXRhIiwicGFyc2VOZXdNZXRhIiwibWV0YSIsInJhd01ldGEiLCJzdWJzdHJpbmciLCJsYXN0SW5kZXhPZiIsImluZGV4T2YiLCJwYXJzZWQiLCJmb3JtYXQiLCJibG9jayIsIm91dCIsImZpZWxkIiwiYWNjdW0iLCJsaW5lIiwiY2hhckF0IiwibCIsInN1YnN0ciIsInNlbGYiLCJvcmlnaW5hbFJlcXVpcmUiLCJwb3NzaWJsZVBhdGgiLCJiYXNlbmFtZSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzdHJpcEJPTSIsImFkZGVkIiwiYXRpbWVNcyIsIm1vZGlmaWVkIiwibXRpbWVNcyIsIkpTT04iLCJzdHJpbmdpZnkiLCJfY29tcGlsZSIsImRpZEV4cG9ydCIsImlzRW1wdHkiLCJleHBvcnRzIiwibWFrZVBsYWNlaG9sZGVyUGx1Z2luIiwiZ2V0TmFtZSIsImdldEF1dGhvciIsImdldERlc2NyaXB0aW9uIiwic291cmNlIiwid2Vic2l0ZSIsImxvYWRDb250ZW50IiwiZmlsZSIsInN0YWNrIiwidW5sb2FkQ29udGVudCIsImNhY2hlIiwiaXNMb2FkZWQiLCJyZWxvYWRDb250ZW50IiwiY2FudFVubG9hZCIsImxvYWROZXdDb250ZW50IiwiYmFzZWRpciIsImZpbGVzIiwicmVhZGRpclN5bmMiLCJjb250ZW50TGlzdCIsInZhbHVlcyIsInJlbW92ZWQiLCJmIiwibG9hZEFsbENvbnRlbnQiLCJlcnJvcnMiLCJsb2FkUGx1Z2lucyIsImxvYWRUaGVtZXMiLCJjb25maWciLCJmbGF0IiwiRUQiLCJXZWJTb2NrZXQiLCJpbml0U2V0dGluZ3MiLCJjaGVja0Zvckd1aWxkcyIsImluaXRpYWxpemUiLCJpbml0aWFsaXplU2V0dGluZ3MiLCJhdG9iIiwiYWRkRXZlbnRMaXN0ZW5lciIsIlBsdWdpbkNlcnRpZmllciIsImdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJpbml0T2JzZXJ2ZXIiLCJzaG93Q29udGVudEVycm9ycyIsInBsdWdpbnMiLCJ0aGVtZXMiLCJwcmV2aW91c1ZlcnNpb24iLCJzaG93Q2hhbmdlbG9nTW9kYWwiLCJFbW9qaU1vZHVsZSIsInBhdGNoU29jaWFsIiwicGF0Y2hHdWlsZFBpbGxzIiwicGF0Y2hHdWlsZExpc3RJdGVtcyIsInBhdGNoR3VpbGRTZXBhcmF0b3IiLCJwYXRjaE1lc3NhZ2VIZWFkZXIiLCJwYXRjaE1lbWJlckxpc3QiLCJwYXRjaEF0dGFjaG1lbnQiLCJoYXZlSW5zdGFsbGVkRGVmYXVsdCIsIm9uQ2xvc2UiLCJsb2dvIiwidG9wIiwiaW5uZXJIVE1MIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsIm9yaWdpbmFsIiwiZ2V0U2V0dGluZ0dyb3VwIiwic2F2ZVNldHRpbmdzIiwibG9hZFNldHRpbmdzIiwic2V0dGluZyIsImNsYXNzTmFtZUxheWVyIiwiY2xhc3NOYW1lU29jaWFsTGlua3MiLCJjbGFzc05hbWVNb2RhbCIsIm1haW5PYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtbGVuIiwibXV0YXRpb24iLCJyYXdPYnNlcnZlciIsImFkZGVkTm9kZXMiLCJsYXllciIsImFuaW1hdGluZyIsInNvY2lhbExpbmtzIiwibW9kYWwiLCJpbm5lciIsInJlc3BvbnNpdmVXaWR0aE1vYmlsZSIsInNldEF0dHJpYnV0ZSIsImdldEVsZW1lbnRCeUlkIiwicmVuZGVyU2lkZWJhciIsInBhcmVudEVsZW1lbnQiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsInNvY2lhbFBhdGNoIiwiVGFiQmFyIiwidG9TdHJpbmciLCJzb2NpYWxNb2R1bGUxIiwibmV3T25lIiwicmV0dXJuVmFsIiwiVG9vbHRpcFdyYXAiLCJzaWRlIiwibGluayIsImhyZWYiLCJ0YXJnZXQiLCJMaWdodGNvcmRMb2dvIiwiQkRMb2dvIiwiY2xhc3NOYW1lQ29sb3JNdXRlZCIsInNpemVzIiwiY2xhc3NOYW1lVmVyc2lvbkhhc2giLCJjb2xvck11dGVkIiwic2l6ZTMyIiwidmVyc2lvbkhhc2giLCJoYXNoIiwiYnJhbmNoIiwiYWRkaXRpb25hbCIsInJlYWN0Iiwic2l6ZTEyIiwiZWxlY3Ryb24iLCJjb21taXQiLCJvcmlnaW5hbFZlcnNpb25zIiwic3BsaWNlIiwiZ2V0R3VpbGRDbGFzc2VzIiwiZ3VpbGRzV3JhcHBlciIsImd1aWxkcyIsInBpbGwiLCJndWlsZExpc3RJdGVtc1BhdGNoIiwiR3VpbGRDbGFzc2VzIiwibGlzdEl0ZW1DbGFzcyIsImJsb2JDbGFzcyIsInJlYWN0SW5zdGFuY2UiLCJHdWlsZENvbXBvbmVudCIsInJldHVybiIsInRoaXNPYmplY3QiLCJndWlsZERhdGEiLCJ1bnJlYWQiLCJzZWxlY3RlZCIsImF1ZGlvIiwidmlkZW8iLCJiYWRnZSIsImFuaW1hdGFibGUiLCJndWlsZFBpbGxQYXRjaCIsImd1aWxkUGlsbCIsImhvdmVyZWQiLCJndWlsZFNlcGFyYXRvclBhdGNoIiwiR3VpbGRzIiwiZ3VpbGRDb21wb25lbnRzIiwiR3VpbGRTZXBhcmF0b3IiLCJTZXBhcmF0b3IiLCJBdHRhY2htZW50UGF0Y2giLCJBdHRhY2htZW50IiwiYXR0YWNobWVudCIsImdldE5lc3RlZFByb3AiLCJ1dWlkdjQiLCJwYXRjaCIsIm1lc3NhZ2VIZWFkZXJQYXRjaCIsIk1lc3NhZ2VIZWFkZXIiLCJkaXNwbGF5IiwiYXBwbHlCYWRnZXMiLCJ1c2VyIiwiY2hhdCIsIm5leHRUaWNrIiwiZGl2IiwiY2hpbGROb2RlcyIsImRpc3RhbnQiLCJnZXRCYWRnZXMiLCJ0aGVuIiwiYmFkZ2VzIiwic3ZnIiwid2lkdGgiLCJzY29wZXMiLCJzY29wZSIsImNvbXBvbmVudCIsImRpdjIiLCJyZWFjdERvbSIsInJlbmRlciIsIm1lbWJlckxpc3RQYXRjaCIsIk1lbWJlckxpc3RJdGVtIiwicmVuZGVyRGVjb3JhdG9ycyIsInVwZGF0ZUluamVjdG9yIiwiaW5qZWN0aW9uUGF0aCIsInJtcmYiLCJ5YXV6bCIsIm1rZGlycCIsInJlcXVlc3QiLCJwYXJlbnRQYXRoIiwiZm9sZGVyTmFtZSIsInppcExpbmsiLCJzYXZlZFppcCIsImV4dHJhY3RlZEZvbGRlciIsInN1Y2Nlc3MiLCJlbmNvZGluZyIsInJlc3BvbnNlIiwic3RhdHVzQ29kZSIsImFscmVhZHlFeGlzdHMiLCJyZXMiLCJleGlzdHMiLCJyZW5hbWUiLCJyb3VuZCIsInBlcmZvcm1hbmNlIiwid3JpdGVGaWxlIiwiemlwZmlsZSIsImxhenlFbnRyaWVzIiwiemlwIiwib24iLCJlbnRyeSIsImZpbGVOYW1lIiwicmVhZEVudHJ5IiwiZnVsbFBhdGgiLCJzeW5jIiwiZGlybmFtZSIsIm9wZW5SZWFkU3RyZWFtIiwicmVhZFN0cmVhbSIsInBpcGUiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIm9uY2UiLCJiYWNrdXBGb2xkZXIiLCJ1bmxpbmsiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsInJlbGVhc2VDaGFubmVsIiwiZ2xvYmFscyIsImdldFJlbGVhc2VDaGFubmVsIiwic3RhYmxlIiwiY2FuYXJ5IiwicHRiIiwicGx1Z2luRGF0YSIsIkJERmlsZSIsIndyaXRlRmlsZVN5bmMiLCJwYXJzZSIsInNldHRpbmdzRmlsZSIsInVubGlua1N5bmMiLCJfaW5qZWN0aW9uUGF0aCIsImJhc2UiLCJyb2FtaW5nQmFzZSIsImdldFBhdGgiLCJyb2FtaW5nTG9jYXRpb24iLCJyZWFsTG9jYXRpb24iLCJjb25maWdGaWxlIiwiX2NvbmZpZ0ZpbGUiLCJfQkRGaWxlIiwiX3NldHRpbmdzRmlsZSIsImdldFBsdWdpbkZpbGUiLCJzZXRTZXR0aW5nR3JvdXAiLCJEZXZNb2RlIiwiZGVidWdMaXN0ZW5lciIsImNvcHlTZWxlY3Rvckxpc3RlbmVyIiwic3RhcnREZWJ1Z0xpc3RlbmVyIiwic3RhcnRDb3B5U2VsZWN0b3IiLCJzdG9wRGVidWdMaXN0ZW5lciIsInN0b3BDb3B5U2VsZWN0b3IiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwid2hpY2giLCJzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24iLCJzZWxlY3RvciIsImdldFNlbGVjdG9yIiwiY2xhc3NMYXllciIsImNsYXNzSXRlbXMiLCJkaXNhYmxlZFBvaW50ZXJFdmVudHMiLCJtZW51IiwiYXR0YWNoIiwiY20iLCJxdWVyeSIsImNvbnRhaW5lciIsImxheWVyQ29udGFpbmVyIiwiY21XcmFwIiwic3R5bGVGbGV4aWJsZSIsImFjY29tbW9kYXRlU2Nyb2xsYmFyIiwiYXBwZW5kIiwiY2xpZW50WSIsImxlZnQiLCJjbGllbnRYIiwic2Nyb2xsZXJDbGFzc2VzIiwic2Nyb2xsZXJXcmFwIiwic2Nyb2xsZXJUaGVtZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmUiLCJzY3JvbGxlciIsInJlbW92ZUNNIiwia2V5Q29kZSIsImNtZyIsImNtaSIsIml0ZW0iLCJsYWJlbENvbnRhaW5lciIsImNvbG9yRGVmYXVsdCIsImxhYmVsIiwiTmF0aXZlTW9kdWxlIiwiY29weSIsImVsZW1lbnRzIiwicXVlcnlBbGwiLCJmb2N1c2VkIiwic2VwYXJhdG9yIiwic2Nyb2xsSGVpZ2h0IiwiZWwiLCJuYW1lcyIsInBhcmVudE5vZGUiLCJ1bnNoaWZ0Iiwib3duZXJEb2N1bWVudCIsInRhZ05hbWUiLCJmcm9tIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJnZXRSdWxlcyIsInN0eWxlU2hlZXRzIiwic2hlZXRzIiwicnVsZXMiLCJjc3NSdWxlcyIsImVsZW1lbnRSdWxlcyIsInNlbGVjdG9yVGV4dCIsIm1hdGNoZXMiLCJEaXNhYmxlVHlwaW5nIiwiQXBpIiwiZW5zdXJlRXhwb3J0ZWQiLCJzdGFydFR5cGluZyIsInR5cGluZ01vZHVsZSIsImRpc2FibGVkIiwiY2FsbCIsInN0b3BUeXBpbmciLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwiZGVsZXRlIiwiaGFuZGxlUmVxdWVzdCIsIlJvdXRlcyIsInN0YXR1cyIsInN0YXR1c1RleHQiLCJBdXRob3JpemF0aW9uIiwianNvbiIsImNhdGNoIiwibmV3UHJvbWlzZSIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJ1c2VycyIsInJlc3BvbnNlQm9keSIsInByb21pc2UiLCJ1c2VyX2lkIiwiTGlnaHRjb3JkRXJyb3IiLCJyb3V0ZSIsInJlamVjdCIsIm5vZGVGZXRjaCIsIlNFUlZFUl9VUkwiLCJoZWFkZXJzIiwiTGlnaHRjb3JkVXNlckJhZGdlIiwiQnVnSHVudGVyQmFkZ2UiLCJoZWFkIiwic2NyaXB0Iiwic3JjIiwib25sb2FkIiwiYW5pbWF0ZSIsInRpbWluZyIsIl8iLCJ1cGRhdGUiLCJkdXJhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsInRpbWUiLCJ0aW1lRnJhY3Rpb24iLCJwcm9ncmVzcyIsIlEiLCJwYXJzZUhUTUwiLCJpc0hUTUwiLCJOb2RlTGlzdCIsInNvbWUiLCJuIiwibm9kZVR5cGUiLCJiYXNlRWxlbWVudCIsImh0bWwiLCJmcmFnbWVudCIsInRlbXBsYXRlIiwiY2xvbmVOb2RlIiwiZXNjYXBlSFRNTCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJzcGFuRWxlbWVudCIsIm5vZGVWYWx1ZSIsImFkZENsYXNzIiwicmVtb3ZlQ2xhc3MiLCJ0b2dnbGVDbGFzcyIsImNsYXNzbmFtZSIsImluZGljYXRvciIsImhhc0NsYXNzIiwiZXZlcnkiLCJyZXBsYWNlQ2xhc3MiLCJvbGROYW1lIiwibmV3TmFtZSIsImFwcGVuZFRvIiwidGhpc05vZGUiLCJ0aGF0Tm9kZSIsInByZXBlbmRUbyIsInByZXBlbmQiLCJpbnNlcnRBZnRlciIsInRhcmdldE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJuZXh0U2libGluZyIsIm5ld05vZGUiLCJuZXh0IiwibmV4dEFsbCIsIm5leHRVbnRpbCIsInByZXZpb3VzIiwicHJldmlvdXNBbGwiLCJwcmV2aW91c1VudGlsIiwiaW5kZXhJblBhcmVudCIsIm51bSIsImluZGV4IiwicGFyZW50IiwiZmluZENoaWxkIiwiZmluZENoaWxkcmVuIiwicGFyZW50cyIsImNsb3Nlc3QiLCJwYXJlbnRzVW50aWwiLCJzaWJsaW5ncyIsImF0dHJpYnV0ZSIsImdsb2JhbCIsImdldENvbXB1dGVkU3R5bGUiLCJoZWlnaHQiLCJ0ZXh0Q29udGVudCIsIm91dGVyV2lkdGgiLCJvZmZzZXRXaWR0aCIsIm91dGVySGVpZ2h0Iiwib2Zmc2V0SGVpZ2h0Iiwib2Zmc2V0IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwibGlzdGVuZXJzIiwiX2xpc3RlbmVycyIsImV2ZW50IiwiZGVsZWdhdGUiLCJuYW1lc3BhY2UiLCJoYXNEZWxlZ2F0ZSIsImV2ZW50RnVuYyIsImNhbmNlbCIsIm5ld0NhbmNlbCIsImZpbmRJbmRleCIsIl9fb2ZmQWxsIiwibWF0Y2hGaWx0ZXIiLCJsaXN0ZW5lciIsImRlZmF1bHRGaWx0ZXIiLCJvbk1vdW50Q2hhbmdlIiwib25Nb3VudCIsIndyYXBwZWRDYWxsYmFjayIsIm9ic2VydmVyIiwibm9kZXMiLCJyZW1vdmVkTm9kZXMiLCJkaXJlY3RNYXRjaCIsInBhcmVudE1hdGNoIiwib25Vbm1vdW50Iiwib25BZGRlZCIsIndyYXAiLCJkb21XcmFwcGVyIiwicmVzb2x2ZUVsZW1lbnQiLCJCZXR0ZXJEaXNjb3JkIiwiRW1vamlSZWdleCIsIkN1c3RvbUVtb2ppTW9kdWxlIiwiQ3VzdG9tRW1vamkiLCJFbW9qaU1vZHVsZUFwaSIsImdldEN1c3RvbUVtb2ppQnlJZCIsIkF1dG9jb21wbGV0ZU1vZHVsZSIsIkF1dG9Db21wbGV0aW9uVGVtcGxhdGVzIiwiZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyIsIkVtb2ppTW9kdWxlUXVlcnkiLCJxdWVyeUVtb2ppUmVzdWx0cyIsIk1lc3NhZ2VzIiwiRU1PSklfTUFUQ0hJTkciLCJndWlsZE1vZHVsZSIsImdldEd1aWxkIiwiZ2V0R3VpbGRzIiwiaXNGZXRjaGluZyIsImVtb2ppU2VhcmNoIiwiZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dCIsIkxJR0hUQ09SRF9FTU9KSVMiLCJhcmcxIiwiYXJnMiIsImNvbmRpdGlvbiIsInNldEVtb2ppVXNhYmxlIiwicXVlcnlSZXN1bHRzIiwicmVzdWx0cyIsInJlbmRlclJlc3VsdHMiLCJEIiwiZW1vamlzIiwiRU1PSkkiLCJFbW9qaSIsImVtb2ppIiwidW5pcXVlTmFtZSIsInNlbnRpbmVsIiwiZ3VpbGRJZCIsImdldFBsYWluVGV4dCIsImlzQW5pbWF0ZWQiLCJhbmltYXRlZCIsIm1hbmFnZWQiLCJvcmlnaW5hbE5hbWUiLCJnZXRSYXdUZXh0IiwiY2FuY2VsRW1vamlSZW5kZXIiLCJjYW5jZWxFbW90ZVJlbmRlciIsIm5ld0NvbnRlbnQiLCJoYXNQYXJzZWQiLCJleGVjIiwicmF3Iiwid29yZHMiLCJ3b3JkIiwiYXJyIiwiZW1vamlJZCIsImp1bWJvYWJsZSIsInJlZHVjZSIsImN1cnJlbnQiLCJzaGlmdCIsIm8iLCJ1IiwiZCIsIm9uSG92ZXIiLCJSIiwicHJlZml4IiwiVGl0bGUiLCJFbW9qaUZpbHRlck1vZHVsZSIsImlzRW1vamlEaXNhYmxlZCIsImlzVXNhYmxlIiwidXNhYmxlIiwic3Vycm9nYXRlcyIsImRpdmVyc2l0eSIsImNhY2hlMiIsInByb2Nlc3NBdHRhY2htZW50IiwiaXNUcnVzdGVkIiwic3VzcGVjdCIsImNoZWNrVmlydXNlcyIsInJlc3VsdENhbGxiYWNrIiwicmVtb3ZlQ2FsbGJhY2siLCJpc0hhcm1mdWwiLCJrZXl3b3JkIiwib29mIiwibm9fY29tbWVudHMiLCJyZWdleHBzIiwicmVnZXgiLCJoYXNoVG9VcmwiLCJoYXJtIiwiY2hlY2tIYXNoIiwiZ2V0Q3VycmVudFdlYkNvbnRlbnRzIiwidXNlckFnZW50Iiwid3JvbmdDYWxsYmFjayIsInJlc3VsdCIsInByb2Nlc3NGaWxlIiwiX19wYXRoIiwiY3J5cHRvIiwiQnVmZmVyIiwiYWxsb2MiLCJjcmVhdGVSZWFkU3RyZWFtIiwiY2h1bmsiLCJjb25jYXQiLCJoYXNoUmVzdWx0IiwiZGlnZXN0IiwicmVuZGVyVG9FbGVtZW50cyIsImZsb3dlclN0YXJNb2R1bGUiLCJmbG93ZXJTdGFyQ29udGFpbmVyIiwiY2hpbGRNb2R1bGUiLCJjaGlsZENvbnRhaW5lciIsImJvcmRlckNvbG9yIiwibmV4dE5vZGUiLCJjb25maXJtVGV4dCIsImRhbmdlciIsIm9uQ2FuY2VsIiwib25Db25maXJtIiwic2hlbGwiLCJvcGVuRXh0ZXJuYWwiLCJ0b29sdGlwV3JhcCIsInZpZXdCb3giLCJ4IiwieSIsIm1hc2siLCJmaWxsIiwicG9pbnRlckV2ZW50cyIsIm9mZmljaWFsIiwiZmxvd2VyU3RhciIsInN0cm9rZSIsIlBsdWdpbk1vZHVsZSIsImxvYWRQbHVnaW5EYXRhIiwibG9hZCIsInNhdmVQbHVnaW5EYXRhIiwiY2hhbm5lbFN3aXRjaCIsInN0YXJ0UGx1Z2luIiwic3RvcFBsdWdpbiIsImVuYWJsZVBsdWdpbiIsImRpc2FibGVQbHVnaW4iLCJ0b2dnbGVQbHVnaW4iLCJwIiwiZmlsZW5hbWVPck5hbWUiLCJiZHBsdWdpbiIsImVkaXQiLCJvcGVuSXRlbSIsInVwZGF0ZVBsdWdpbkxpc3QiLCJzYXZlZCIsIm5ld01lc3NhZ2UiLCJvbk1lc3NhZ2UiLCJvblN3aXRjaCIsIlYyX1B1YmxpY1NlcnZlcnMiLCJfYXBwZW5kQnV0dG9uIiwiTGF5ZXIiLCJyb290SWQiLCJWMkNfUHVibGljU2VydmVycyIsInJvb3QiLCJfcm9vdCIsImluamVjdFJvb3QiLCJjbGFzc05hbWVMYXllcnMiLCJsYXllcnMiLCJidXR0b24iLCJidG4iLCJjaXJjbGVCdXR0b25NYXNrIiwiY2xhc3NOYW1lU2Nyb2xsZXIiLCJzY3JvbGxiYXJXaWR0aCIsImFkZEJ1dHRvbiIsImd1aWxkUGF0Y2giLCJHdWlsZExpc3QiLCJ3ZWJwYWNrTW9kdWxlcyIsIkd1aWxkTGlzdE9sZCIsInJlbW92ZUJ1dHRvbiIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsInJlYWN0RGV2VG9vbHMiLCJleHRlbnNpb25QYXRoIiwicGxhdGZvcm0iLCJlbnYiLCJMT0NBTEFQUERBVEEiLCJIT01FIiwidmVyc2lvbnMiLCJpc0V4dGVuc2lvbkluc3RhbGxlZCIsInJlbW92ZURldlRvb2xzRXh0ZW5zaW9uIiwiZGlkSW5zdGFsbCIsImFkZERldlRvb2xzRXh0ZW5zaW9uIiwic2V0SW1tZWRpYXRlIiwiaXNEZXZUb29sc09wZW5lZCIsIlYyX1NldHRpbmdzUGFuZWwiLCJzaWRlQmFyT25DbGljayIsInVwZGF0ZVNldHRpbmdzIiwic2lkZWJhciIsIlYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciIsInNob3dPcmlnaW5hbCIsImNsYXNzU2lkZWJhciIsImNvbnRlbnRSZWdpb24iLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwiY29yZVNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJjYXRlZ29yaWVzIiwiU2V0Iiwic2VjdGlvbnMiLCJsaWdodGNvcmRTZXR0aW5ncyIsIlByZXNlbmNlU2V0dGluZ3MiLCJNc2dMb2dTZXR0aW5ncyIsInJlbmRlckNvcmVTZXR0aW5ncyIsInJlbmRlckN1c3RvbUNzc0VkaXRvciIsInJlbmRlckFkZG9uUGFuZSIsInJlbmRlckxpZ2h0Y29yZFNldHRpbmdzIiwicmVuZGVyUHJlc2VuY2VTZXR0aW5ncyIsInJlbmRlckFjY291bnRJbmZvcyIsImNoZWNrZWQiLCJwdWJsaWNTZXJ2ZXJzTW9kdWxlIiwidm9pY2VNb2RlIiwidGZIb3VyIiwiY29sb3JlZFRleHQiLCJkTW9kZSIsIlNldHRpbmdzIiwiZGV2TW9kZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwidGFicyIsImNvcmVDb21wb25lbnQiLCJTY3JvbGxlciIsImNvbnRlbnRDb2x1bW4iLCJmYWRlIiwiZGFyayIsIlNlY3Rpb25lZFNldHRpbmdzUGFuZWwiLCJUb29scyIsImxpZ2h0Y29yZENvbXBvbmVudCIsIlByZXNlbmNlQ29tcG9uZW50IiwiVjJDX1ByZXNlbmNlU2V0dGluZ3MiLCJBY2NvdW50SW5mb3NDb21wb25lbnQiLCJWMkNfQWNjb3VudEluZm9zIiwiY3VzdG9tQ3NzQ29tcG9uZW50IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJjb21wb25lbnREaWRNb3VudCIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib3JpZ2luYWxSZW5kZXIiLCJlbnVtZXJhYmxlIiwiQ2FyZExpc3QiLCJMQ2l0ZW1zIiwiY2hhbmdlbG9nQnV0dG9uIiwiSGlzdG9yeSIsImNoYW5nZWxvZ0J1dHRvbkxDIiwiU2lkZUJhciIsImhlYWRlclRleHQiLCJoZWFkZXJCdXR0b24iLCJjaGFuZ2VMb2ciLCJUaGVtZU1vZHVsZSIsImxvYWRUaGVtZURhdGEiLCJ0aGVtZSIsInVuZXNjYXBlIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJlc2NhcGUiLCJwYXJhbXMiLCJpbnN0ZWFkIiwic2lsZW50IiwiZm9yY2UiLCJvcmlnTWV0aG9kIiwiY2FuY2VsUGF0Y2giLCJvcmlnaW5hbE1ldGhvZCIsImNhbGxPcmlnaW5hbE1ldGhvZCIsInRlbXBSZXQiLCJfX21vbmtleVBhdGNoZWQiLCJkaXNjb25uZWN0IiwiaGFzTm90aWNlIiwibWVtYmVybGlzdCIsIm1lbWJlcnNXcmFwIiwiZm9ybSIsInJpZ2h0IiwiYm90dG9tIiwidG9hc3RXcmFwcGVyIiwiaWNvbiIsInRpbWVvdXQiLCJ0b2FzdEVsZW0iLCJpbm5lclRleHQiLCJtb2RhbE1vZHVsZSIsImhpZGVPbkZ1bGxzY3JlZW4iLCJoZWFkZXJNb2R1bGUiLCJoZWFkZXIiLCJmb290ZXIyTW9kdWxlIiwiZm9jdXNMb2NrIiwiYmFja2Ryb3AiLCJiYWNrZHJvcFdpdGhMYXllciIsImNsb3NpbmdMaXN0ZW5lcnMiLCJwbHVnaW5FcnJvcnMiLCJ0aGVtZUVycm9ycyIsImdlbmVyYXRlVGFiIiwiQ2hhbmdlbG9nQ2xhc3NlcyIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsImRlZmF1bHRQcm9wcyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImNlIiwiY2hhbmdlbG9nSXRlbXMiLCJtYXJnaW4iLCJtYXJnaW5Ub3AiLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiam9pbkJEMiIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwicmVkIiwiVjIiLCJlZGl0b3JEZXRhY2hlZCIsInJlcSIsIndlYnBhY2tKc29ucCIsIl9fZXh0cmFfaWRfXyIsInNob3VsZFByb3RlY3QiLCJ0aGVNb2R1bGUiLCJjbGVhciIsInNvcnQiLCJnZXRUb2tlbiIsImdldEVtYWlsIiwic2hvd1Rva2VuIiwicHJvdGVjdCIsInByb3h5IiwiZnVuYyIsInByb3BOYW1lcyIsInByb3RvTmFtZXMiLCJwcm90b1Byb3AiLCJpbnRlcm5hbCIsImpvaW5CRDEiLCJJbnZpdGVBY3Rpb25zIiwiYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbCIsImxlYXZlQkQxIiwiR3VpbGRBY3Rpb25zIiwibGVhdmVHdWlsZCIsImxlYXZlQkQyIiwibGVhdmVMQyIsInJlYWN0Q29tcG9uZW50IiwiYW5jaG9yQ2xhc3NlcyIsInNsYXRlRWRpdG9yQ2xhc3NlcyIsIm1lc3NhZ2VDbGFzc2VzIiwidW5yZWFkTWVudGlvbnNCYXIiLCJndWlsZHNFcnJvciIsIk1lc3NhZ2VDb250ZW50Q29tcG9uZW50IiwiVG9vbHRpcFdyYXBwZXIiLCJUb29sdGlwcyIsImhpZGUiLCJzaG93Iiwic3VibWl0IiwiYWN0aXZhdGVSYWdpbmdEZW1vbiIsImRpc21pc3MiLCJLZXlHZW5lcmF0b3IiLCJMYXllclN0YWNrIiwiVXNlclN0b3JlIiwiQ2hhbm5lbFN0b3JlIiwiQ2hhbm5lbEFjdGlvbnMiLCJQcml2YXRlQ2hhbm5lbEFjdGlvbnMiLCJvcGVuRE0iLCJ1c2VySWQiLCJzZWxmSWQiLCJwcml2YXRlQ2hhbm5lbElkIiwiZ2V0RE1Gcm9tVXNlcklkIiwic2VsZWN0UHJpdmF0ZUNoYW5uZWwiLCJvcGVuUHJpdmF0ZUNoYW5uZWwiLCJwYXJzZVNldHRpbmdzIiwiVm9pY2VNb2RlIiwicHJvZmlsTW9kdWxlIiwiZmV0Y2hNdXR1YWxGcmllbmRzIiwiY29udGVudE1vZHVsZSIsIm1hcmdpbk1vZHVsZTIiLCJkZWZhdWx0TWFyZ2luaDUiLCJjb2xvck1vZHVsZSIsImNvbG9yU3RhbmRhcmQiLCJzaXplTW9kdWxlIiwic2Nyb2xsYmFyTW9kdWxlMSIsInNjcm9sbGJhckdob3N0SGFpcmxpbmUiLCJHdWlsZE1vZHVsZSIsImdldFJlbGF0aW9uc2hpcHMiLCJzZXNzaW9uTW9kdWxlIiwiZ2V0U2Vzc2lvbnMiLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsInBhZGRpbmciLCJzaXplMTQiLCJoNSIsImdldFByb2ZpbGVWYWx1ZSIsImdldFN0YXRpc3RpY3MiLCJnZXRTZXNzaW9uVmFsdWUiLCJtYXJnaW5Cb3R0b20yMCIsInNlc3Npb25zUmF3Iiwic2Vzc2lvbnMiLCJzZXNzaW9uSWQiLCJjbGllbnRJbmZvIiwib3MiLCJjbGllbnQiLCJhY3RpdmUiLCJhY3Rpdml0aWVzIiwicmVwZWF0IiwiY3JlYXRlZEF0IiwiYXZhdGFyIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiZ2V0RnVsbFllYXIiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZmxhZ3MiLCJoYXNQcmVtaXVtU3Vic2NyaXB0aW9uIiwiZW1haWwiLCJtZmFFbmFibGVkIiwibW9iaWxlIiwicGhvbmUiLCJ2ZXJpZmllZCIsInJlbGF0aW9ucyIsImZyaWVuZHMiLCJpc0ZyaWVuZCIsImlzQmxvY2tlZCIsImhpZ2h0bGlnaHRKUyIsImhpZ2hsaWdodCIsIm1lc3NhZ2VNb2R1bGUxIiwibWVzc2FnZU1vZHVsZTIiLCJDb2RlQ29udGVudCIsIl9faHRtbCIsImxhbmd1YWdlIiwibWFyZ2luQm90dG9tOCIsIlYyQ19QbHVnaW5DYXJkIiwic2hvd1NldHRpbmdzIiwic2V0SW5pdGlhbFN0YXRlIiwiaGFzU2V0dGluZ3MiLCJhZGRvbiIsImdldFNldHRpbmdzUGFuZWwiLCJyZWxvYWRzIiwidHJ1c3RlZCIsInNldFN0YXRlIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwidW5tb3VudGVkIiwibGlua3MiLCJpbnZpdGUiLCJ0ZXN0ZXIiLCJkb25hdGUiLCJwYXRyZW9uIiwiYXV0aG9ySWQiLCJhdXRob3JMaW5rIiwiaXNTY2FubmluZyIsImNvbnRlbnRNYW5hZ2VyIiwiU3dpdGNoIiwiVG9vbHRpcCIsImFzY2VuZGluZyIsImlzUGx1Z2lucyIsInJldmVyc2UiLCJvcGVuRm9sZGVyIiwic2hvdWxkRGVsZXRlIiwiY29uZmlybURlbGV0ZSIsInNvcnRPcHRpb25zIiwiZGlyZWN0aW9ucyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0UHJvcHMiLCJnZXRBZGRvbnMiLCJzb3J0ZWRBZGRvbnMiLCJiIiwiY2FwIiwiZmlyc3QiLCJzZWNvbmQiLCJsb2NhbGVDb21wYXJlIiwicmVuZGVyZWQiLCJyZWZyZXNoSWNvbiIsImZvcmNlVXBkYXRlIiwiYWRkb25DYXJkcyIsImZpbGxSdWxlIiwiY2xpcFJ1bGUiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJvcGFjaXR5IiwiVjJDX0NoZWNrYm94IiwiY2hlY2tib3hFbGVtZW50IiwiY2hlY2tib3giLCJjaGVja2JveElubmVyIiwiU2VsZWN0IiwiZHJvcGRvd24iLCJjcmVhdGVSZWYiLCJzaG93TWVudSIsImhpZGVNZW51Iiwib3B0IiwiaXNPcGVuIiwiU2VhcmNoIiwib25LZXlEb3duIiwicGxhY2Vob2xkZXIiLCJWMkNfQ29udGVudENvbHVtbiIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiZWRpdG9yIiwiYWNlIiwic2V0VGhlbWUiLCJzZXNzaW9uIiwic2V0TW9kZSIsInNldFNob3dQcmludE1hcmdpbiIsInNldEZvbnRTaXplIiwiZGVzdHJveSIsInByZXZQcm9wcyIsInByZXZTdGF0ZSIsImRldGFjaGVkUm9vdCIsImNvZGVNaXJyb3IiLCJsaW5lTnVtYmVycyIsIm1vZGUiLCJpbmRlbnRVbml0Iiwic2Nyb2xsYmFyU3R5bGUiLCJfY2NzcyIsImNjc3MiLCJ1cGRhdGVMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJTZXR0aW5nc1RpdGxlIiwiQ2hlY2tib3giLCJib3JkZXJSYWRpdXMiLCJib3JkZXJSaWdodCIsImJvcmRlckxlZnQiLCJmb250U2l6ZSIsIm1hcmdpbkxlZnQiLCJhcmciLCJnZXRWYWx1ZSIsImJ0b2EiLCJkcm9vdCIsImluamVjdERldGFjaGVkUm9vdCIsIkJERXJyb3JCb3VuZGFyeSIsImhhc0Vycm9yIiwiY29tcG9uZW50RGlkQ2F0Y2giLCJEZWxldGUiLCJEb3duQXJyb3ciLCJFZGl0IiwiVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIiwiZGF0YVN0b3JlIiwicHJldmlldyIsImlzZmV0Y2hpbmciLCJhc3NldENvbXBvbmVudHMiLCJ1cGRhdGVXaGVuRmV0Y2hlZCIsImNvbXAiLCJkZWZhdWx0U2V0dGluZyIsIlJQQ1Byb3BzIiwiYXNzZXQiLCJ1cGRhdGVQcmV2aWV3IiwibWFyZ2luTW9kdWxlIiwib3B0aW9uc0NvbXBvbmVudHMiLCJvaGdvZG9oZnVjayIsIl9vcHRpb25zQ29tcG9uZW50cyIsImFycmF5IiwiaW5wdXRUZXh0TW9kdWxlcyIsIklucHV0VGV4dCIsIlB1cmVDb21wb25lbnQiLCJyZW1vdmVLZXliaW5kIiwiX2hvcml6b250YWwiLCJpbnB1dE1pbmkiLCJzaXplMTYiLCJzaXplMjAiLCJpbnB1dCIsImxhc3RFZGl0ZWQiLCJpc1RpbWluZyIsInJvd01vZHVsZSIsImZsZXhNb2R1bGUiLCJpbnB1dE1vZHVsZSIsInNpemVNb2R1bGUyIiwicm93IiwiZmxleENoaWxkIiwiSW5wdXROdW1iZXJNb2R1bGVzIiwiSW5wdXROdW1iZXIiLCJjb2xvclRyYW5zcGFyZW50Iiwic2V0VmFsdWUiLCJjbGlwYm9hcmQiLCJJbnB1dENob2ljZU1vZHVsZXMiLCJJbnB1dENob2ljZSIsIkRpdmlkZXJNb2R1bGVzIiwiRGl2aWRlciIsImRpdmlkZXIiLCJkaXZpZGVyRGVmYXVsdCIsIkRpc2NvcmRCdXR0b24iLCJScGNQcmV2aWV3IiwiY2hhbmdlVGFiIiwidGFiIiwiYW5jaWVudFRhYiIsInNldEFjdGl2ZSIsInJwYyIsImZsZXgiLCJpc0FjdGl2ZSIsIlByb2ZpbGUiLCJQb3BvdXQiLCJUYWIiLCJwb3BvdXRNb2R1bGUiLCJ1c2VyUG9wb3V0IiwidmVydGljYWwiLCJhbGlnblN0cmV0Y2giLCJzdHJlYW1lck1vZGVFbmFibGVkQnRuIiwiYWN0aXZpdHlVc2VyUG9wb3V0IiwibXV0ZWQiLCJ0aGVtZUdob3N0SGFpcmxpbmVDaGFubmVscyIsIm5vdGUiLCJwcm8iLCJpbmxpbmUiLCJyb290TW9kdWxlMSIsImZsZXhNb2R1bGUxIiwic3R5bGluZ01vZHVsZTEiLCJuYW1lVGFnTW9kdWxlMSIsImFjdGl2aXR5TW9kdWxlMSIsInRleHRNb2R1bGUxIiwic2l6ZU1vZHVsZTEiLCJzY3JvbGxlck1vZHVsZTEiLCJub3RlTW9kdWxlMSIsInByb3RpcE1vZHVsZTEiLCJjb2xvck1vZHVsZTEiLCJhdmF0YXJNb2R1bGUxIiwidXNlck1vZHVsZTEiLCJhdmF0YXJVUkwiLCJnZXRBdmF0YXJVUkwiLCJ0aW1lc3RhbXBDbGFzcyIsInRpbWVzdGFtcCIsImltYWdlcyIsImFzc2V0c0xhcmdlSW1hZ2VVc2VyUG9wb3V0IiwiYXNzZXRzTGFyZ2VNYXNrVXNlclBvcG91dCIsImFzc2V0c1NtYWxsSW1hZ2VVc2VyUG9wb3V0IiwiaGVhZGVyUGxheWluZyIsImp1c3RpZnlDZW50ZXIiLCJhbGlnbkNlbnRlciIsIm5vV3JhcCIsImhlYWRlclRvcCIsImF2YXRhcldyYXBwZXJOb3JtYWwiLCJhdmF0YXJIaW50IiwiYXZhdGFySGludElubmVyIiwiVklFV19QUk9GSUxFIiwiaG9yaXpvbnRhbCIsImp1c3RpZnlTdGFydCIsImhlYWRlclRhZ05vTmlja25hbWUiLCJuYW1lVGFnIiwiaGVhZGVyVGFnVXNlcm5hbWVOb05pY2tuYW1lIiwiaGVhZGVyVGV4dE5vcm1hbCIsIlVTRVJfQUNUSVZJVFlfSEVBREVSX1BMQVlJTkciLCJib2R5Tm9ybWFsIiwiY29udGVudEltYWdlc1VzZXJQb3BvdXQiLCJjb250ZW50Tm9JbWFnZXNVc2VyUG9wb3V0IiwibmFtZU5vcm1hbCIsImFjdGl2aXR5TmFtZSIsInRpbWVDb21wb25lbnQiLCJ0aW1lc3RhbXBSZW5kZXIiLCJUaW1lc3RhbXAiLCJlbmQiLCJzY3JvbGxlckZhZGUiLCJib2R5SW5uZXIiLCJib2R5VGl0bGUiLCJOT1RFIiwiTk9URV9QTEFDRUhPTERFUiIsInByb3RpcCIsIlBJTk5FRF9NRVNTQUdFU19QUk9fVElQIiwidGlwIiwiQ09OVEVYVF9NRU5VX0hJTlQiLCJTdGF0dXNNb2R1bGVzIiwiU3RhdHVzIiwiZ2V0UHJlc2VuY2UiLCJQcm9maWxlTW9kdWxlcyIsInRvcFNlY3Rpb25TdHJlYW1pbmciLCJhY3Rpdml0eVByb2ZpbGUiLCJhc3NldHNMYXJnZUltYWdlUHJvZmlsZSIsImFzc2V0c0xhcmdlTWFza1Byb2ZpbGUiLCJhc3NldHNTbWFsbEltYWdlUHJvZmlsZSIsInRvcFNlY3Rpb25QbGF5aW5nIiwiaGVhZGVySW5mbyIsInByb2ZpbGVCYWRnZXMiLCJoZWFkZXJGaWxsIiwiY29udGVudEltYWdlc1Byb2ZpbGUiLCJ1c2VySW5mb1NlY3Rpb24iLCJ1c2VySW5mb1NlY3Rpb25IZWFkZXIiLCJDb25uZWN0ZWRBY2NvdW50cyIsImFjY291bnRzIiwiQWNjb3VudE1vZHVsZTEiLCJnZXRBY2NvdW50cyIsImFjY3MiLCJ2aXNpYmlsaXR5IiwiYWNjIiwiY29ubmVjdGVkQWNjb3VudHMiLCJDb25uZWN0ZWRBY2NvdW50IiwiZmxvd2VyTW9kdWxlMSIsImFuY2hvck1vZHVsZTEiLCJTb2NpYWxDb25zdGFudHMiLCJjb25zdGFudHNTb2NpYWwiLCJjb25uZWN0ZWRBY2NvdW50IiwiY29ubmVjdGVkQWNjb3VudEljb24iLCJ3aGl0ZSIsImdyZXkiLCJjb25uZWN0ZWRBY2NvdW50TmFtZUlubmVyIiwiY29ubmVjdGVkQWNjb3VudE5hbWUiLCJjb25uZWN0ZWRBY2NvdW50VmVyaWZpZWRJY29uIiwiY29ubmVjdGVkQWNjb3VudE9wZW5JY29uIiwiQmFkZ2VzIiwicm9vdE1vZHVsZSIsIlVzZXJGbGFncyIsInNlcmlhbGl6ZWQiLCJmbGFnTmFtZSIsImhhc0ZsYWciLCJzZWFyY2hhYmxlIiwiQmFkZ2UiLCJwcm9maWxlQmFkZ2VXcmFwcGVyIiwicHJvZmlsZUJhZGdlIiwiVjJDX0xheWVyIiwia2V5dXBMaXN0ZW5lciIsInRyYW5zZm9ybSIsImNvbXBvbmVudFdpbGxNb3VudCIsImNoYW5nZUNhdGVnb3J5Iiwic2VhcmNoS2V5RG93biIsImNoZWNrQ29ubmVjdGlvbiIsImNvbm5lY3QiLCJHdWlsZFN0b3JlIiwiQXZhdGFyRGVmYXVsdHMiLCJTb3J0ZWRHdWlsZFN0b3JlIiwic2VsZWN0ZWRDYXRlZ29yeSIsImxvYWRpbmciLCJzZXJ2ZXJzIiwiY29ubmVjdGlvbiIsImZldGNoIiwic2VydmVyIiwiam9pbmVkIiwidGVybSIsImNhdGVnb3J5QnV0dG9ucyIsInRvdGFsIiwic2J2IiwiY29udGVudFNjcm9sbGVyIiwic2VydmVyQ2FyZCIsInBpbm5lZCIsImFjY2VwdEludml0ZSIsImludml0ZV9jb2RlIiwiam9pbkVuZFBvaW50IiwiaWRlbnRpZmllciIsImNyZWRlbnRpYWxzIiwid2luZG93T3B0aW9ucyIsInNjcmVlblgiLCJzY3JlZW5ZIiwiam9pbldpbmRvdyIsImxvYWRVUkwiLCJiYWNrZ3JvdW5kQ29sb3IiLCJyZXNpemFibGUiLCJtYXhpbWl6YWJsZSIsIm1pbmltaXphYmxlIiwiYWx3YXlzT25Ub3AiLCJjZW50ZXIiLCJ3ZWJQcmVmZXJlbmNlcyIsIm5vZGVJbnRlZ3JhdGlvbiIsImJkU2VydmVyIiwib25saW5lIiwibWVtYmVycyIsImljb25VcmwiLCJuYXRpdmVqb2luIiwic2VydmVyMiIsImd1aWxkTGlzdCIsImdldEZsYXR0ZW5lZEd1aWxkSWRzIiwiZGVmYXVsdExpc3QiLCJERUZBVUxUX0FWQVRBUlMiLCJTZXJ2ZXJDYXJkIiwiZmFsbGJhY2siLCJmbG9vciIsImNvbm5lY3RFbmRQb2ludCIsIlNpZGViYXJWaWV3IiwidG9vbHMiLCJUYWJCYXJTZXBhcmF0b3IiLCJzZWFyY2hJbnB1dCIsIlRhYkJhckhlYWRlciIsIlRhYkJhckl0ZW0iLCJtYXhMZW5ndGgiLCJzZWFyY2hpbnB1dCIsIm5vdENvbm5lY3RlZCIsImNvbHVtbk1vZHVsZSIsIm1hcmdpbkJvdHRvbSIsIm1pbkhlaWdodCIsImxpbmVIZWlnaHQiLCJWMkNfU2VydmVyQ2FyZCIsImltYWdlRXJyb3IiLCJjYXJkTW9kdWxlIiwiY2FyZCIsImNhcmRQcmltYXJ5IiwiX2hvcml6b250YWxSZXZlcnNlIiwid3JhcE1vZHVsZSIsInN0cmVhbWVyTW9kZUVuYWJsZWQiLCJvbkVycm9yIiwiaGFuZGxlRXJyb3IiLCJWMkNfU2lkZWJhclZpZXciLCJWMkNfUmVsb2FkSWNvbiIsInhtbG5zIiwiVjJDX1Njcm9sbGVyIiwic2Nyb2xsZXJIb3Jpem9udGFsIiwic2Nyb2xsZXJNb2R1bGUyIiwic2lkZWJhclJlZ2lvblNjcm9sbGVyIiwid3JhcHBlckNsYXNzIiwic2Nyb2xsZXJDbGFzcyIsImNvbnRlbnRSZWdpb25TY3JvbGxlciIsImNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAiLCJ0aGVtZUdob3N0Iiwic2Nyb2xsZXJUcmFjayIsIlYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwic2VjdGlvbiIsIlNldHRpbmdzR3JvdXAiLCJWMkNfU2V0dGluZ3NHcm91cCIsImJ1dHRvbkNvbXBvbmVudCIsIlYyQ19TZXR0aW5nc1BhbmVsIiwiVjJDX1NldHRpbmdzVGl0bGUiLCJtYXJnaW5Ub3A2MCIsIlYyQ19TaWRlQmFyIiwic2kiLCJzY24iLCJucyIsIm5zY24iLCJzZXRTZWxlY3RlZCIsInNpZGViYXJzIiwiaW5pdGlhbFNlbGVjdGlvbiIsInNldFVuc2VsZWN0ZWQiLCJzaWRlYmFySW5kZXgiLCJTd2l0Y2hJdGVtIiwiVjJDX1RhYkJhckhlYWRlciIsIlYyQ19UYWJCYXJJdGVtIiwiVjJDX1RhYkJhclNlcGFyYXRvciIsImludGVydmFsTW9kdWxlMSIsIkludGVydmFsIiwiVGltZVJlbmRlciIsIl9pbnRlcnZhbCIsImdldFVwZGF0ZWRUaW1lIiwiZ2V0RGlmZiIsImNoZWNrVW5peCIsImhvdXJzIiwibWludXRlcyIsInNlY29uZHMiLCJyZW5kZXJUaW1lIiwibnVtYmVyIiwicmVtb3ZlWmVybyIsInVzZWRQcm9wcyIsIlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX0VORCIsIlVTRVJfQUNUSVZJVFlfVElNRVNUQU1QX1NUQVJUIiwiVjJDX1Rvb2xzIiwidG9vbHNNb2R1bGUiLCJ0b29sc0NvbnRhaW5lciIsImNvbnRhaW5lck1vZHVsZSIsImNsb3NlQnV0dG9uIiwiY2xvc2VCdXR0b25Cb2xkIiwia2V5YmluZCIsImtleWJpbmRCb2xkIiwiVG9vbHRpcENsYXNzZXMiLCJnZXRUb29sdGlwQ2xhc3NlcyIsIlRvb2x0aXBMYXllcnMiLCJnZXRUb29sdGlwTGF5ZXJzIiwiZ2V0Q2xhc3MiLCJzaWRlT3JDb2xvciIsInVwcGVyQ2FzZSIsInRvb2x0aXBDbGFzcyIsImNsYXNzRXhpc3RzIiwidG9QeCIsIkVtdWxhdGVkVG9vbHRpcCIsInByZXZlbnRGbGlwIiwidG9vbHRpcEVsZW1lbnQiLCJ0b29sdGlwIiwibGFiZWxFbGVtZW50IiwidG9vbHRpcENvbnRlbnQiLCJwb2ludGVyRWxlbWVudCIsInRvb2x0aXBQb2ludGVyIiwicG9wb3V0cyIsImNhblNob3dBYm92ZSIsImNhblNob3dCZWxvdyIsImNhblNob3dMZWZ0IiwiY2FuU2hvd1JpZ2h0IiwiX2NsYXNzTmFtZSIsInNob3dBYm92ZSIsInNob3dCZWxvdyIsInNob3dMZWZ0Iiwic2hvd1JpZ2h0IiwiY2VudGVySG9yaXpvbnRhbGx5IiwiY2VudGVyVmVydGljYWxseSIsIm5vZGVjZW50ZXIiLCJmaW5kRE9NTm9kZSIsIlYyQ19YU3ZnIl0s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T0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQzs7Ozs7Ozs7Ozs7QUNBQSxvQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSxrQyIsImZpbGUiOiJtYWluLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IFwiLi9zcmMvaW5kZXguanNcIik7XG4iLCJpbXBvcnQgeyByZW1vdGUgfSBmcm9tIFwiZWxlY3Ryb25cIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuLy8gdmFyIHNldHRpbmdzUGFuZWwsIHZvaWNlTW9kZSwgcGx1Z2luTW9kdWxlLCB0aGVtZU1vZHVsZSwgZE1vZGUsIHB1YmxpY1NlcnZlcnNNb2R1bGUsIG1haW5Db3JlLCBCRFYyO1xyXG5leHBvcnQgY29uc3QgbWluaW11bURpc2NvcmRWZXJzaW9uID0gXCIwLjAuMzA2XCI7XHJcbmV4cG9ydCBjb25zdCBjdXJyZW50RGlzY29yZFZlcnNpb24gPSAod2luZG93LkRpc2NvcmROYXRpdmUgJiYgd2luZG93LkRpc2NvcmROYXRpdmUucmVtb3RlQXBwICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcC5nZXRWZXJzaW9uKCkpIHx8IFwiMC4wLjMwNlwiO1xyXG5leHBvcnQgY29uc3QgbWluU3VwcG9ydGVkVmVyc2lvbiA9IFwiMC4zLjBcIjtcclxuZXhwb3J0IGNvbnN0IGJiZFZlcnNpb24gPSBcIjAuMy40XCI7XHJcbmV4cG9ydCBjb25zdCBMQ0NoYW5lbG9nID0ge1xyXG4gICAgZGVzY3JpcHRpb246IFwiTGlnaHRjb3JkJ3MgY2hhbmdlbG9nXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJXaGF0J3MgTmV3P1wiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCJMaWdodGNvcmQgaXMgbm93IGF2YWlsYWJsZSAhXCIsXHJcbiAgICAgICAgICAgICAgICBcIldlIHJlbW92ZWQgZW1vdGVzLiBUaGF0J3Mgc2FkIGZvciBwZW9wbGUgd2hvIHdlcmUgYWN0dWFsbHkgdXNpbmcgaXQsIGJ1dCBpdCB3YXMgbGVhZGluZyB0byBtb3JlIGxvYWRpbmcgdGltZSBhbmQgc29tZSBiYXNpYyB3b3JkcyB3ZXJlIGVtb3RlLlwiXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICBdLFxyXG4gICAgaW1hZ2U6IFwiaHR0cHM6Ly9pLmltZ3VyLmNvbS9zZk5ocXdQLnBuZ1wiLFxyXG4gICAgdGl0bGU6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICBzdWJ0aXRsZTogXCJ2XCIrcmVtb3RlLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9uLFxyXG4gICAgZm9vdGVyOiAoZnVuY3Rpb24oKXtcclxuICAgICAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcclxuICAgICAgICBjb25zdCBNb2RhbFN0YWNrID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJwdXNoXCIsIFwidXBkYXRlXCIsIFwicG9wXCIsIFwicG9wV2l0aEtleVwiKTtcclxuICAgICAgICBpZighVGV4dEVsZW1lbnQgfHwgIU1vZGFsU3RhY2spcmV0dXJuIG51bGxcclxuXHJcbiAgICAgICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcclxuICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xyXG4gICAgICAgICAgICBjbGljay5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgQkRWMi5qb2luTEMoKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gQW5jaG9yID8gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHtjbGFzc05hbWU6IGAke0FuY2hvckNsYXNzZXMuYW5jaG9yfSAke0FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gLCBvbkNsaWNrOiBqb2luU3VwcG9ydFNlcnZlcn0sIFwiSm9pbiBvdXIgRGlzY29yZCBTZXJ2ZXIuXCIpO1xyXG4gICAgICAgIHJldHVybiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVGV4dEVsZW1lbnQsIHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRH0sIFwiTmVlZCBzdXBwb3J0PyBcIiwgc3VwcG9ydExpbmspO1xyXG4gICAgfSkoKVxyXG59XHJcbmV4cG9ydCBjb25zdCBiYmRDaGFuZ2Vsb2cgPSB7XHJcbiAgICBkZXNjcmlwdGlvbjogXCJCQkQncyBjaGFuZ2Vsb2cuXCIsXHJcbiAgICBjaGFuZ2VzOiBbXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICB0aXRsZTogXCJXaGF0J3MgTmV3P1wiLFxyXG4gICAgICAgICAgICBpdGVtczogW1xyXG4gICAgICAgICAgICAgICAgXCIqKkxpZ2h0Y29yZCoqIGlzIG5vdyB1c2luZyBCYW5kYWdlZEJELiBUaGF0IG1lYW5zIGFsbCBwbHVnaW5zIHlvdSB3ZXJlIHVzaW5nIGNhbiBiZSB1c2VkIHRvbyAhXCIsXHJcbiAgICAgICAgICAgICAgICBcIioqV2luZG93IFRyYW5zcGFyZW5jeSoqIGNoYW5nZXMgd2VyZSBtYWRlIHRvIG1vcmUgY29tcGF0aWJsZSB3aXRoIGV4dGVybmFsIHdpbmRvdyBtYW5hZ2VycyBhbmQgYWRkb25zIGxpa2UgR2xhc3Njb3JkLlwiLFxyXG4gICAgICAgICAgICAgICAgXCJJbml0aWFsaXphdGlvbiBzZXF1ZW5jZSBoYXMgb25jZSBhZ2FpbiBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkgdG8gaG9wZWZ1bGx5IGltcHJvdmUgbG9hZGluZyB0aW1lcy5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkJ1ZyBGaXhlc1wiLFxyXG4gICAgICAgICAgICB0eXBlOiBcImZpeGVkXCIsXHJcbiAgICAgICAgICAgIGl0ZW1zOiBbXHJcbiAgICAgICAgICAgICAgICBcIlNvbWUgZml4ZXMgcmVsYXRlZCB0byBzaG93aW5nIG1vZGFscyBpbiB0aGUgYEJkQXBpYC5cIlxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzID0ge1xyXG4gICAgXCJDdXN0b20gY3NzIGxpdmUgdXBkYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0wXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJDdXN0b20gY3NzIGF1dG8gdWRwYXRlXCI6ICAgICB7aWQ6IFwiYmRhLWNzcy0xXCIsIGluZm86IFwiXCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogdHJ1ZSwgIGNhdDogXCJjb3JlXCJ9LFxyXG4gICAgXCJCZXR0ZXJEaXNjb3JkIEJsdWVcIjogICAgICAgICB7aWQ6IFwiYmRhLWdzLWJcIiwgIGluZm86IFwiUmVwbGFjZSBEaXNjb3JkIGJsdWUgd2l0aCBCRCBCbHVlXCIsICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogZmFsc2UsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwifSxcclxuXHJcbiAgICAvKiBDb3JlICovXHJcbiAgICAvKiA9PT09PT0gKi9cclxuICAgIFwiUHVibGljIFNlcnZlcnNcIjogICAgICAgICAgICAge2lkOiBcImJkYS1ncy0xXCIsICBpbmZvOiBcIkRpc3BsYXkgcHVibGljIHNlcnZlcnMgYnV0dG9uXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJNaW5pbWFsIE1vZGVcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTJcIiwgIGluZm86IFwiSGlkZSBlbGVtZW50cyBhbmQgcmVkdWNlIHRoZSBzaXplIG9mIGVsZW1lbnRzLlwiLCAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIE1vZGVcIjogICAgICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtNFwiLCAgaW5mbzogXCJPbmx5IHNob3cgdm9pY2UgY2hhdFwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiSGlkZSBDaGFubmVsc1wiOiAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0zXCIsICBpbmZvOiBcIkhpZGUgY2hhbm5lbHMgaW4gbWluaW1hbCBtb2RlXCIsICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJEYXJrIE1vZGVcIjogICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTVcIiwgIGluZm86IFwiTWFrZSBjZXJ0YWluIGVsZW1lbnRzIGRhcmsgYnkgZGVmYXVsdCh3aXApXCIsICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIlZvaWNlIERpc2Nvbm5lY3RcIjogICAgICAgICAgIHtpZDogXCJiZGEtZGMtMFwiLCAgaW5mbzogXCJEaXNjb25uZWN0IGZyb20gdm9pY2Ugc2VydmVyIHdoZW4gY2xvc2luZyBEaXNjb3JkXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiMjQgSG91ciBUaW1lc3RhbXBzXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy02XCIsICBpbmZvOiBcIlJlcGxhY2UgMTJociB0aW1lc3RhbXBzIHdpdGggcHJvcGVyIG9uZXNcIiwgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJDb2xvcmVkIFRleHRcIjogICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTdcIiwgIGluZm86IFwiTWFrZSB0ZXh0IGNvbG9yIHRoZSBzYW1lIGFzIHJvbGUgY29sb3JcIiwgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIk5vcm1hbGl6ZSBDbGFzc2VzXCI6ICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTRcIiwgaW5mbzogXCJBZGRzIHN0YWJsZSBjbGFzc2VzIHRvIGVsZW1lbnRzIHRvIGhlbHAgdGhlbWVzLiAoZS5nLiBhZGRzIC5kYS1jaGFubmVscyB0byAuY2hhbm5lbHMtSWUybDZBKVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcblxyXG4gICAgLyogQ29udGVudCAqL1xyXG4gICAgXCJDb250ZW50IEVycm9yIE1vZGFsXCI6ICAgICAgICB7aWQ6IFwiZm9yay1wcy0xXCIsIGluZm86IFwiU2hvd3MgYSBtb2RhbCB3aXRoIHBsdWdpbi90aGVtZSBlcnJvcnNcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjYW4gUGx1Z2luc1wiOiAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTZcIiwgaW5mbzogXCJTY2FuIHBsdWdpbnMgZm9yIGFueSB0aHJlYXQgdGhhdCBjYW4gYmUgaGlkZGVuIGluc2lkZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNob3cgVG9hc3RzXCI6ICAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTJcIiwgaW5mbzogXCJTaG93cyBhIHNtYWxsIG5vdGlmaWNhdGlvbiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJTY3JvbGwgVG8gU2V0dGluZ3NcIjogICAgICAgICB7aWQ6IFwiZm9yay1wcy0zXCIsIGluZm86IFwiQXV0by1zY3JvbGxzIHRvIGEgcGx1Z2luJ3Mgc2V0dGluZ3Mgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQgKG9ubHkgaWYgb3V0IG9mIHZpZXcpXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJBdXRvbWF0aWMgTG9hZGluZ1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy01XCIsIGluZm86IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG5cclxuICAgIC8qIERldmVsb3BlciAqL1xyXG4gICAgXCJEZXZlbG9wZXIgTW9kZVwiOiAgICAgICAgIFx0ICB7aWQ6IFwiYmRhLWdzLThcIiwgaW5mbzogXCJEZXZlbG9wZXIgTW9kZSBUb2dnbGVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiQ29weSBTZWxlY3RvclwiOlx0XHRcdCAge2lkOiBcImZvcmstZG0tMVwiLCBpbmZvOiBcIkFkZHMgYSBcXFwiQ29weSBTZWxlY3RvclxcXCIgb3B0aW9uIHRvIGNvbnRleHQgbWVudXMgd2hlbiBkZXZlbG9wZXIgbW9kZSBpcyBhY3RpdmVcIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImRldmVsb3BlciBzZXR0aW5nc1wifSxcclxuICAgIFwiUmVhY3QgRGV2VG9vbHNcIjpcdFx0XHQgIHtpZDogXCJyZWFjdERldlRvb2xzXCIsIGluZm86IFwiQWRkcyByZWFjdCBkZXZlbG9wZXIgdG9vbHMgdG8gdGhlIGRldnRvb2xzLiBNdXN0IGJlIGluc3RhbGxlZCBpbiBHb29nbGUgQ2hyb21lIG9uIHlvdXIgcGMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiB0cnVlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xyXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQmx1ciBQZXJzb25uYWwgSW5mb3JtYXRpb25zXCI6e2lkOiBcImxpZ2h0Y29yZC02XCIsIGluZm86IFwiQmx1ciBzZW5zaXRpdmUgaW5mb3JtYXRpb25zIGxpa2UgZW1haWwsIHBheW1lbnQgaW5mb3MgYW5kIG1vcmUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzIEludGVybmFsIERldmVsb3BlciBPcHRpb25zLiBUaGlzIGFsbG93IHRoZSBcXFwiRXhwZXJpbWVudHNcXFwiIHRhYiBhbmQgdGhlIFxcXCJEZXZlbG9wZXIgT3B0aW9uc1xcXCIgdGFiLiAobXVzdCByZW9wZW4gc2V0dGluZ3MpXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQWQgQmxvY2tcIjogICAgICAgICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC00XCIsIGluZm86IFwiQmxvY2sgYW55IEJPVCB0aGF0IGRtIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkIFdpbmRvdyAqL1xyXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgd2luZG93J3MgQWx3YXlzLW9uLVRvcCBtb2RlLCB3aGVyZSBMaWdodGNvcmQgc3RheXMgb24gdG9wIG9mIG90aGVyIGFwcGxpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiV2luZG93XCJ9LFxyXG4gICAgXHJcbiAgICAvKiogUmljaFByZXNlbmNlICovXHJcbiAgICBcIkVuYWJsZVwiOiAgICAgICAgICAgICAgICAgICAgIHtpZDogXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiLCBpbmZvOiBcIkVuYWJsZSBSaWNoUHJlc2VuY2UgYmVsb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwic3RhdHVzXCJ9XHJcbn07XHJcblxyXG5leHBvcnQgY29uc3QgZGVmYXVsdENvb2tpZSA9IHtcclxuICAgIFwiYmRhLWdzLTFcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy0zXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTVcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLTZcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy03XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtOFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMFwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMVwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtMlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtNFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTZcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWVzLTdcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWdzLWJcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy04XCI6IHRydWUsXHJcbiAgICBcImJkYS1kYy0wXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtY3NzLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMVwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLTlcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1kbS0xXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLXBzLTFcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0yXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTRcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy01XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNlwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWVzLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstZXMtM1wiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXdwLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstd3AtMlwiOiBmYWxzZSxcclxuICAgIFwiZm9yay1iZXRhXCI6IHRydWUsXHJcbiAgICBcInJlYWN0RGV2VG9vbHNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0xXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtMlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTNcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC00XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtNlwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtN1wiOiBmYWxzZSxcclxufTtcclxuXHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NDb29raWUgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5nc1JQQyA9IHt9O1xyXG5leHBvcnQgY29uc3QgZGVmYXVsdFJQQyA9IHtcclxuICAgIFwibmFtZVwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgXCJhcHBsaWNhdGlvbl9pZFwiOiBcIjcxMTQxNjk1NzcxODc1NzQxOFwiLFxyXG4gICAgXCJzdGF0ZVwiOiBcIkxpZ2h0Y29yZCBDbGllbnRcIixcclxuICAgIFwiZGV0YWlsc1wiOiBcIkJyb3dzaW5nIERpc2NvcmRcIixcclxuICAgIFwidGltZXN0YW1wcy5zdGFydFwiOiBEYXRlLm5vdygpLFxyXG4gICAgXCJhc3NldHMuc21hbGxcIjogbnVsbCxcclxuICAgIFwiYXNzZXRzLmxhcmdlXCI6IFwiNzEyMzIzODIxMDM3NjgyNzkxXCJcclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2luRXJyb3JzID0gW107XHJcbmV4cG9ydCBjb25zdCBiZHRoZW1lRXJyb3JzID0gW107IC8vIGRlZmluZSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcclxuXHJcbmV4cG9ydCBjb25zdCBiZENvbmZpZyA9IE9iamVjdC5jcmVhdGUoQmV0dGVyRGlzY29yZENvbmZpZyk7XHJcblxyXG5leHBvcnQgY29uc3QgYmR0aGVtZXMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGJkcGx1Z2lucyA9IHt9O1xyXG5cclxuZXhwb3J0IGNvbnN0IHBsdWdpbkNvb2tpZSA9IHt9O1xyXG5leHBvcnQgY29uc3QgdGhlbWVDb29raWUgPSB7fTsiLCJpbXBvcnQgbG9jYWxTdG9yYWdlRml4IGZyb20gXCIuL2xvY2FsU3RvcmFnZUZpeFwiO1xyXG5pbXBvcnQgbG9hZGluZ0ljb24gZnJvbSBcIi4vbG9hZGluZ0ljb25cIjtcclxubG9jYWxTdG9yYWdlRml4KCk7XHJcbmxvYWRpbmdJY29uKCk7XHJcblxyXG5jb25zdCBkZXByZWNhdGVHbG9iYWwgPSAoa2V5LCB2YWx1ZSkgPT4ge1xyXG4gICAgLy8gdmFsdWUgPSB0eXBlb2YodmFsdWUpICE9PSBcIm9iamVjdFwiID8gdmFsdWUgOiBuZXcgUHJveHkodmFsdWUsIHtcclxuICAgIC8vICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgbW9kKSB7XHJcbiAgICAvLyAgICAgICAgIGlmICghb2JqLmhhc093blByb3BlcnR5KG1vZCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAvLyAgICAgICAgIHJldHVybiBvYmpbbW9kXTtcclxuICAgIC8vICAgICB9LFxyXG4gICAgLy8gICAgIHNldDogZnVuY3Rpb24ob2JqLCBtb2QpIHtcclxuICAgIC8vICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShtb2QpKSByZXR1cm4gVXRpbHMuZXJyKFwiRGVwcmVjYXRlZCBHbG9iYWxcIiwgXCJUcnlpbmcgdG8gb3ZlcndyaXRlIGRlcHJlY2F0ZWQgQkQgZ2xvYmFsc1wiKTtcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9KTtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIGtleSwge1xyXG4gICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgVXRpbHMud2FybihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIGBcIiR7a2V5fVwiIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSBvbmx5IHVzZSBCZEFwaS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgXHJcbn07XHJcblxyXG5cclxuaW1wb3J0ICogYXMgR2xvYmFscyBmcm9tIFwiLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZ2xvYmFsS2V5cyA9IE9iamVjdC5rZXlzKEdsb2JhbHMpO1xyXG5mb3IgKGNvbnN0IGtleSBvZiBnbG9iYWxLZXlzKSBkZXByZWNhdGVHbG9iYWwoa2V5LCBHbG9iYWxzW2tleV0pO1xyXG5cclxuXHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL21vZHVsZXMvY2xhc3NOb3JtYWxpemVyXCI7XHJcblxyXG5kZXByZWNhdGVHbG9iYWwoXCJCRFYyXCIsIEJEVjIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJwbHVnaW5Nb2R1bGVcIiwgcGx1Z2luTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJVdGlsc1wiLCBVdGlscyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJERXZlbnRzXCIsIEJERXZlbnRzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiRGF0YVN0b3JlXCIsIERhdGFTdG9yZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNvbnRlbnRNYW5hZ2VyXCIsIENvbnRlbnRNYW5hZ2VyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XHJcblxyXG53aW5kb3cuQmRBcGkgPSBCZEFwaTtcclxuXHJcbmltcG9ydCBDb3JlIGZyb20gXCIuL21vZHVsZXMvY29yZVwiO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCBDb3JlKTtcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29yZVdyYXBwZXIge1xyXG4gICAgY29uc3RydWN0b3IoYmRDb25maWcpIHtcclxuICAgICAgICBDb3JlLnNldENvbmZpZyhiZENvbmZpZyk7XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdCgpIHtcclxuICAgICAgICAvLyBkZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCB0aGlzLm1haW5Db3JlKTtcclxuICAgICAgICBDb3JlLmluaXQoKTtcclxuICAgIH1cclxufVxyXG5cclxuLy8gZnVuY3Rpb24gcGF0Y2hNb2R1bGVMb2FkKCkge1xyXG4vLyAgICAgY29uc3QgbmFtZXNwYWNlID0gXCJiZXR0ZXJkaXNjb3JkXCI7XHJcbi8vICAgICBjb25zdCBwcmVmaXggPSBgJHtuYW1lc3BhY2V9L2A7XHJcbi8vICAgICBjb25zdCBNb2R1bGUgPSByZXF1aXJlKFwibW9kdWxlXCIpO1xyXG4vLyAgICAgY29uc3QgbG9hZCA9IE1vZHVsZS5fbG9hZDtcclxuLy8gICAgIC8vIGNvbnN0IHJlc29sdmVGaWxlbmFtZSA9IE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lO1xyXG5cclxuLy8gICAgIE1vZHVsZS5fbG9hZCA9IGZ1bmN0aW9uKHJlcXVlc3QpIHtcclxuLy8gICAgICAgICBpZiAocmVxdWVzdCA9PT0gbmFtZXNwYWNlIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbi8vICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZCA9IHJlcXVlc3Quc3Vic3RyKHByZWZpeC5sZW5ndGgpO1xyXG4vLyAgICAgICAgICAgICBpZiAocmVxdWVzdGVkID09IFwiYXBpXCIpIHJldHVybiBCZEFwaTtcclxuLy8gICAgICAgICB9XHJcblxyXG4vLyAgICAgICAgIHJldHVybiBsb2FkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbi8vICAgICB9O1xyXG5cclxuLy8gICAgIC8vIE1vZHVsZS5fcmVzb2x2ZUZpbGVuYW1lID0gZnVuY3Rpb24gKHJlcXVlc3QsIHBhcmVudCwgaXNNYWluKSB7XHJcbi8vICAgICAvLyAgICAgaWYgKHJlcXVlc3QgPT09IFwiYmV0dGVyZGlzY29yZFwiIHx8IHJlcXVlc3Quc3RhcnRzV2l0aChcImJldHRlcmRpc2NvcmQvXCIpKSB7XHJcbi8vICAgICAvLyAgICAgICAgIGNvbnN0IGNvbnRlbnRQYXRoID0gUGx1Z2luTWFuYWdlci5nZXRQbHVnaW5QYXRoQnlNb2R1bGUocGFyZW50KTtcclxuLy8gICAgIC8vICAgICAgICAgaWYgKGNvbnRlbnRQYXRoKSByZXR1cm4gcmVxdWVzdDtcclxuLy8gICAgIC8vICAgICB9XHJcblxyXG4vLyAgICAgLy8gICAgIHJldHVybiByZXNvbHZlRmlsZW5hbWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxuLy8gICAgIC8vIH07XHJcblxyXG4vLyAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xyXG4vLyAgICAgICAgIE1vZHVsZS5fbG9hZCA9IGxvYWQ7XHJcbi8vICAgICB9O1xyXG4vLyB9XHJcblxyXG4vLyBwYXRjaE1vZHVsZUxvYWQoKTtcclxuXHJcbi8vIHZhciBzZXR0aW5nc1BhbmVsLCB2b2ljZU1vZGUsLCBkTW9kZSwgcHVibGljU2VydmVyc01vZHVsZTtcclxuLy8gdmFyIGJkQ29uZmlnID0gbnVsbDtcclxuXHJcbnJlcXVpcmUoXCJyZXF1ZXN0XCIpLy8ganVzdCBpbiBjYWNoZSBzbyBwbHVnaW4gY2FuIHJlcXVpcmUgaXQgdG9vIiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gICAgY29uc3QgdjJMb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgdjJMb2FkZXIuY2xhc3NOYW1lID0gXCJiZC1sb2FkZXJ2MlwiO1xyXG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2MkxvYWRlcik7XHJcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBcImNvbnRlbnRXaW5kb3dcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KGNvbnRlbnRXaW5kb3csIHtcclxuICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImxvY2FsU3RvcmFnZVwiKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBvYmpbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUHJldmVudCBpbnRlcmNlcHRpb24gYnkgcGF0Y2hpbmcgUmVmbGVjdC5hcHBseSBhbmQgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0LCBcImFwcGx5XCIsIHt2YWx1ZTogUmVmbGVjdC5hcHBseSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcblxyXG4gICAgY29uc3Qgb09wZW4gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbjtcclxuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgIGlmICh1cmwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImFwaS93ZWJob29rc1wiKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XHJcbiAgICBpbmplY3QyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHR3ZWx2ZUhvdXIgPSBuZXcgUmVnRXhwKGAoWzAtOV17MSwyfSk6KFswLTldezEsMn0pXFxcXHMoQU18UE0pYCk7XHJcbiAgICAgICAgY29uc3QgY29udmVydCA9IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gZGF0YS5yZXR1cm5WYWx1ZS5tYXRjaCh0d2VsdmVIb3VyKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaGVkIHx8IG1hdGNoZWQubGVuZ3RoICE9PSA0KSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMTJcIiA6IHBhcnNlSW50KG1hdGNoZWRbMV0pICsgMTJ9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBjYW5jZWxDb3p5ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImNhbGVuZGFyRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ296eSBtb2RlXHJcbiAgICAgICAgY29uc3QgY2FuY2VsQ29tcGFjdCA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJkYXRlRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ29tcGFjdCBtb2RlXHJcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSB0aGlzLmNhbmNlbDI0SG91cigpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyXHJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XHJcbmxldCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXHJcbmxldCBETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcblxyXG5jb25zdCBibG9ja2VkID0ge31cclxuXHJcbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXHJcbmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKCl7XHJcbiAgICBpZih1c2VyTW9kdWxlKXJldHVybiB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgcmV0dXJuIG51bGxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuYW50aURNID0gdGhpcy5hbnRpRE0uYmluZCh0aGlzKVxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuXHJcbiAgICAgICAgZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnVuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXHJcbiAgICB9XHJcblxyXG4gICAgYW50aURNKGV2KXtcclxuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkID09PSBnZXRDdXJyZW50VXNlcigpLmlkKVxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuZ3VpbGRfaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSBDaGFubmVsTW9kdWxlLmdldENoYW5uZWwoZXYubWVzc2FnZS5jaGFubmVsX2lkKVxyXG4gICAgICAgIGlmKCFjaGFubmVsKXJldHVybiAvLyBtaWdodCBiZSBicm9rZW5cclxuXHJcbiAgICAgICAgaWYoY2hhbm5lbC50eXBlICE9PSAxKXJldHVyblxyXG5cclxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cclxuXHJcbiAgICAgICAgaWYoc2Nhbk1lc3NhZ2UoZXYubWVzc2FnZSkpe1xyXG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcclxuICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGBbQWRCbG9ja106IEJsb2NrZWQgJHtldi5tZXNzYWdlLmF1dGhvci51c2VybmFtZX0jJHtldi5tZXNzYWdlLmF1dGhvci5kaXNjcmltaW5hdG9yfWAsIHtcclxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIndhcm5pbmdcIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighcmVsYXRpb25TaGlwTW9kdWxlKXJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxuICAgICAgICAgICAgcmVsYXRpb25TaGlwTW9kdWxlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkLCB7XHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgIH0sIDIpXHJcbiAgICAgICAgICAgIGlmKCFETU1vZHVsZSlETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNjYW5NZXNzYWdlKG1lc3NhZ2Upe1xyXG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxyXG4gICAgaWYoRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmdnL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuY29tL2ludml0ZS9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkYXBwLmNvbS9pbnZpdGUvXCIpKXJldHVybiB0cnVlXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbn1cclxuZnVuY3Rpb24gRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgc2VhcmNoKXtcclxuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkc1xyXG4gICAgaWYoZW1iZWRzLmxlbmd0aCA9PT0gMClyZXR1cm4gZmFsc2VcclxuICAgIHJldHVybiBlbWJlZHMubWFwKGVtYmVkID0+IHtcclxuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcclxuICAgICAgICBpZigoZW1iZWQudGl0bGUgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKChlbWJlZC5kZXNjcmlwdGlvbiB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKGVtYmVkLmZpZWxkcy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBlLnZhbHVlLmluY2x1ZGVzKHNlYXJjaCkgfHwgZS5uYW1lLmluY2x1ZGVzKHNlYXJjaClcclxuICAgICAgICB9KS5pbmNsdWRlcyh0cnVlKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIHJldHVybiBmYWxzZVxyXG5cclxuICAgIH0pLmluY2x1ZGVzKHRydWUpXHJcbn0iLCJpbXBvcnQge3NldHRpbmdzUlBDLCBkZWZhdWx0UlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuXHJcbmNvbnN0IGRpc3BhdGNoZXIgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uRGlzcGF0Y2hlciYmbS5kZWZhdWx0JiZtLmRlZmF1bHQuZGlzcGF0Y2gpWzBdLmRlZmF1bHRcclxuY29uc3QgQWN0aW9uVHlwZXMgPSBCRE1vZHVsZXMuZ2V0KG09Pm0uQWN0aW9uVHlwZXMpWzBdLkFjdGlvblR5cGVzXHJcblxyXG5jb25zdCBzb2NrZXRJZCA9IFwibGlnaHRjb3JkLXNwb29mLXNvY2tldFwiXHJcbmNvbnN0IHBpZCA9IHByb2Nlc3MucGlkXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ3VzdG9tUmljaFByZXNlbmNlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuXHJcbiAgICAgICAgdGhpcy5nYW1lID0gc2V0dGluZ3NSUENcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGZvcm1hdGVkR2FtZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQgPT09IGZhbHNlKXJldHVybiBudWxsXHJcbiAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgYXBwbGljYXRpb25faWQ6IHRoaXMuZ2FtZS5hcHBsaWNhdGlvbl9pZCB8fCBkZWZhdWx0UlBDLmFwcGxpY2F0aW9uX2lkLFxyXG4gICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICB0aW1lc3RhbXBzOiB0aGlzLmdhbWVbXCJ0aW1lc3RhbXBzLnN0YXJ0XCJdID8ge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgYXNzZXRzOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgfSA6IHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZ2FtZVxyXG4gICAgfVxyXG5cclxuICAgIHNlbmRHYW1lKCl7XHJcbiAgICAgICAgZGlzcGF0Y2hlci5kaXNwYXRjaCh7XHJcbiAgICAgICAgICAgIHR5cGU6IEFjdGlvblR5cGVzLkxPQ0FMX0FDVElWSVRZX1VQREFURSxcclxuICAgICAgICAgICAgc29ja2V0SWQsXHJcbiAgICAgICAgICAgIHBpZCxcclxuICAgICAgICAgICAgYWN0aXZpdHk6IHRoaXMuZm9ybWF0ZWRHYW1lXHJcbiAgICAgICAgfSkgICBcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKSB7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkVuYWJsaW5nIGN1c3RvbSBSaWNoUHJlc2VuY2VcIilcclxuXHJcbiAgICAgICAgdGhpcy5zZXQoc2V0dGluZ3NSUEMgfHwgT2JqZWN0LmNyZWF0ZShkZWZhdWx0UlBDKSlcclxuXHJcbiAgICAgICAgdGhpcy5zZW5kR2FtZSgpXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpIHtcclxuICAgICAgICBpZighdGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICAgICAgY29uc29sZS5sb2coXCJEaXNhYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBmZXRjaEFzc2V0cyhhcHBsaWNhdGlvbklkKXtcclxuICAgICAgICBsZXQgYXNzZXRzID0gYXdhaXQgQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXNzZXRzKVswXS5nZXRBc3NldHMoYXBwbGljYXRpb25JZClcclxuICAgICAgICBpZihhc3NldHMudW5kZWZpbmVkICYmIHR5cGVvZiBhc3NldHMudW5kZWZpbmVkID09PSBcIm51bWJlclwiKXtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBBcHBsaWNhdGlvblwiKVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXNzZXRzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0KGFjdGl2aXR5KXtcclxuICAgICAgICB0aGlzLmdhbWUgPSBhY3Rpdml0eVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxufSIsImltcG9ydCB7cGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IG1haW5Db3JlIGZyb20gXCIuL2NvcmVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IEJkQXBpID0ge1xyXG4gICAgZ2V0IFJlYWN0KCkgeyByZXR1cm4gQkRWMi5SZWFjdDsgfSxcclxuICAgIGdldCBSZWFjdERPTSgpIHsgcmV0dXJuIEJEVjIuUmVhY3REb207IH0sXHJcbiAgICBnZXQgUmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIEJEVjIuUmVhY3RDb21wb25lbnQ7fSxcclxuICAgIGdldCBXaW5kb3dDb25maWdGaWxlKCkge3JldHVybiBVdGlscy5XaW5kb3dDb25maWdGaWxlO30sXHJcbiAgICBnZXQgc2V0dGluZ3MoKSB7cmV0dXJuIHNldHRpbmdzO30sXHJcbiAgICBnZXQgZW1vdGVzKCkge3JldHVybiB7fX0sIC8vIGRlcHJlY2F0ZWQsIGRlbGV0ZWQgYWxsIGVtb3RlcyBmcm9tIGJldHRlcmRpc2NvcmQuXHJcbiAgICBnZXQgc2NyZWVuV2lkdGgoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOyB9LFxyXG4gICAgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG59O1xyXG5cclxuQmRBcGkuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRBbGxXaW5kb3dQcmVmZXJlbmNlcygpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0V2luZG93UHJlZmVyZW5jZSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLmdldFdpbmRvd1ByZWZlcmVuY2Uoa2V5KTtcclxufTtcclxuXHJcbkJkQXBpLnNldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXksIHZhbHVlKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5pbmplY3RDU1MgPSBmdW5jdGlvbiAoaWQsIGNzcykge1xyXG4gICAgRE9NLmFkZFN0eWxlKERPTS5lc2NhcGVJRChpZCksIGNzcyk7XHJcbn07XHJcblxyXG4vL0NsZWFyIGNzcy9yZW1vdmUgYW55IGVsZW1lbnRcclxuLy9pZCA9IGlkIG9mIGVsZW1lbnRcclxuQmRBcGkuY2xlYXJDU1MgPSBmdW5jdGlvbiAoaWQpIHtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vSW5qZWN0IENTUyB0byBkb2N1bWVudCBoZWFkXHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbi8vY3NzID0gY3VzdG9tIGNzc1xyXG5CZEFwaS5saW5rSlMgPSBmdW5jdGlvbiAoaWQsIHVybCkge1xyXG4gICAgRE9NLmFkZFNjcmlwdChET00uZXNjYXBlSUQoaWQpLCB1cmwpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLnVubGlua0pTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU2NyaXB0KERPTS5lc2NhcGVJRChpZCkpO1xyXG59O1xyXG5cclxuLy9HZXQgYW5vdGhlciBwbHVnaW5cclxuLy9uYW1lID0gbmFtZSBvZiBwbHVnaW5cclxuQmRBcGkuZ2V0UGx1Z2luID0gZnVuY3Rpb24gKG5hbWUpIHtcclxuICAgIGlmIChiZHBsdWdpbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcclxuICAgICAgICByZXR1cm4gYmRwbHVnaW5zW25hbWVdLnBsdWdpbjtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG59O1xyXG5cclxuLy9HZXQgQmV0dGVyRGlzY29yZCBDb3JlXHJcbkJkQXBpLmdldENvcmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBVdGlscy53YXJuKFwiRGVwcmVjYXRpb24gTm90aWNlXCIsIGBCZEFwaS5nZXRDb3JlKCkgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5gKTtcclxuICAgIHJldHVybiBtYWluQ29yZTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIG1vZGFsLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgLSBhIHN0cmluZyBvZiB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIG1vZGFsXHJcbiAqL1xyXG5CZEFwaS5hbGVydCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwge2NhbmNlbFRleHQ6IG51bGx9KTtcclxufTtcclxuXHJcbi8qKlxyXG4gKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZSAtIHRpdGxlIG9mIHRoZSBtb2RhbFxyXG4gKiBAcGFyYW0geyhzdHJpbmd8UmVhY3RFbGVtZW50fEFycmF5PHN0cmluZ3xSZWFjdEVsZW1lbnQ+KX0gY2hpbGRyZW4gLSBhIHNpbmdsZSBvciBtaXhlZCBhcnJheSBvZiByZWFjdCBlbGVtZW50cyBhbmQgc3RyaW5ncy4gRXZlcnkgc3RyaW5nIGlzIHdyYXBwZWQgaW4gRGlzY29yZCdzIGBNYXJrZG93bmAgY29tcG9uZW50IHNvIHN0cmluZ3Mgd2lsbCBzaG93IGFuZCByZW5kZXIgcHJvcGVybHkuXHJcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kYW5nZXI9ZmFsc2VdIC0gd2hldGhlciB0aGUgbWFpbiBidXR0b24gc2hvdWxkIGJlIHJlZCBvciBub3RcclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmNvbmZpcm1UZXh0PU9rYXldIC0gdGV4dCBmb3IgdGhlIGNvbmZpcm1hdGlvbi9zdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNvbmZpcm09Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBzdWJtaXQgYnV0dG9uXHJcbiAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ2FuY2VsPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIHRoZSBrZXkgdXNlZCBmb3IgdGhpcyBtb2RhbFxyXG4gKi9cclxuQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsID0gZnVuY3Rpb24gKHRpdGxlLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy9TaG93IHRvYXN0IGFsZXJ0XHJcbkJkQXBpLnNob3dUb2FzdCA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgVXRpbHMuc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGUgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmQoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kQWxsTW9kdWxlcyA9IGZ1bmN0aW9uKGZpbHRlcikge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEFsbChmaWx0ZXIpO1xyXG59O1xyXG5cclxuLy8gRmluZHMgbW9kdWxlXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3BzID0gZnVuY3Rpb24oLi4ucHJvcHMpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMocHJvcHMpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5UHJvdG90eXBlcyA9IGZ1bmN0aW9uKC4uLnByb3Rvcykge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5UHJvdG90eXBlcyhwcm90b3MpO1xyXG59O1xyXG5cclxuQmRBcGkuZmluZE1vZHVsZUJ5RGlzcGxheU5hbWUgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShuYW1lKTtcclxufTtcclxuXHJcbi8vIEdldHMgcmVhY3QgaW5zdGFuY2VcclxuQmRBcGkuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGZ1bmN0aW9uKG5vZGUpIHtcclxuICAgIGlmICghKG5vZGUgaW5zdGFuY2VvZiB3aW5kb3cualF1ZXJ5KSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgIGlmIChub2RlIGluc3RhbmNlb2YgalF1ZXJ5KSBub2RlID0gbm9kZVswXTtcclxuICAgIHJldHVybiBCRFYyLmdldEludGVybmFsSW5zdGFuY2Uobm9kZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIGRhdGFcclxuQmRBcGkubG9hZERhdGEgPSBmdW5jdGlvbihwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0UGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpO1xyXG59O1xyXG5cclxuQmRBcGkuZ2V0RGF0YSA9IEJkQXBpLmxvYWREYXRhO1xyXG5cclxuLy8gU2V0cyBkYXRhXHJcbkJkQXBpLnNhdmVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCBkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLnNldERhdGEgPSBCZEFwaS5zYXZlRGF0YTtcclxuXHJcbi8vIERlbGV0ZXMgZGF0YVxyXG5CZEFwaS5kZWxldGVEYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbi8vIFBhdGNoZXMgb3RoZXIgZnVuY3Rpb25zXHJcbkJkQXBpLm1vbmtleVBhdGNoID0gZnVuY3Rpb24od2hhdCwgbWV0aG9kTmFtZSwgb3B0aW9ucykge1xyXG4gICAgcmV0dXJuIFV0aWxzLm1vbmtleVBhdGNoKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpO1xyXG59O1xyXG5cclxuLy8gRXZlbnQgd2hlbiBlbGVtZW50IGlzIHJlbW92ZWRcclxuQmRBcGkub25SZW1vdmVkID0gZnVuY3Rpb24obm9kZSwgY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBVdGlscy5vblJlbW92ZWQobm9kZSwgY2FsbGJhY2spO1xyXG59O1xyXG5cclxuLy8gV3JhcHMgZnVuY3Rpb24gaW4gdHJ5Li5jYXRjaFxyXG5CZEFwaS5zdXBwcmVzc0Vycm9ycyA9IGZ1bmN0aW9uKG1ldGhvZCwgbWVzc2FnZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnN1cHByZXNzRXJyb3JzKG1ldGhvZCwgbWVzc2FnZSk7XHJcbn07XHJcblxyXG4vLyBUZXN0cyBmb3IgdmFsaWQgSlNPTlxyXG5CZEFwaS50ZXN0SlNPTiA9IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgIHJldHVybiBVdGlscy50ZXN0SlNPTihkYXRhKTtcclxufTtcclxuXHJcbkJkQXBpLmlzUGx1Z2luRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXBsdWdpbkNvb2tpZVtuYW1lXTtcclxufTtcclxuXHJcbkJkQXBpLmlzVGhlbWVFbmFibGVkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuICEhdGhlbWVDb29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1NldHRpbmdFbmFibGVkID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiAhIXNldHRpbmdzQ29va2llW2lkXTtcclxufTtcclxuXHJcbkJkQXBpLmVuYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIHRydWUpO1xyXG59O1xyXG5cclxuQmRBcGkuZGlzYWJsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsIGZhbHNlKTtcclxufTtcclxuXHJcbkJkQXBpLnRvZ2dsZVNldHRpbmcgPSBmdW5jdGlvbihpZCkge1xyXG4gICAgcmV0dXJuIHNldHRpbmdzUGFuZWwub25DaGFuZ2UoaWQsICFzZXR0aW5nc0Nvb2tpZVtpZF0pO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmdldEJERGF0YSA9IGZ1bmN0aW9uKGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5nZXRCRERhdGEoa2V5KTtcclxufTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zZXRCRERhdGEgPSBmdW5jdGlvbihrZXksIGRhdGEpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuc2V0QkREYXRhKGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5cclxuXHJcbmNvbnN0IG1ha2VBZGRvbkFQSSA9IChjb29raWUsIGxpc3QsIG1hbmFnZXIpID0+IG5ldyBjbGFzcyBBZGRvbkFQSSB7XHJcblxyXG4gICAgZ2V0IGZvbGRlcigpIHtyZXR1cm4gbWFuYWdlci5mb2xkZXI7fVxyXG5cclxuICAgIGlzRW5hYmxlZChuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuICEhY29va2llW25hbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG1hbmFnZXIuZW5hYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmRpc2FibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlKG5hbWUpIHtcclxuICAgICAgICBpZiAoY29va2llW25hbWVdKSB0aGlzLmRpc2FibGUobmFtZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZWxvYWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLnJlbG9hZChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQobmFtZSkge1xyXG4gICAgICAgIGlmIChsaXN0Lmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgICAgIGlmIChsaXN0W25hbWVdLnBsdWdpbikgcmV0dXJuIGxpc3RbbmFtZV0ucGx1Z2luO1xyXG4gICAgICAgICAgICByZXR1cm4gbGlzdFtuYW1lXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QWxsKCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhsaXN0KS5tYXAoayA9PiB0aGlzLmdldChrKSkuZmlsdGVyKGEgPT4gYSk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5CZEFwaS5QbHVnaW5zID0gbWFrZUFkZG9uQVBJKHBsdWdpbkNvb2tpZSwgYmRwbHVnaW5zLCBwbHVnaW5Nb2R1bGUpO1xyXG5CZEFwaS5UaGVtZXMgPSBtYWtlQWRkb25BUEkodGhlbWVDb29raWUsIGJkdGhlbWVzLCB0aGVtZU1vZHVsZSk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBCZEFwaTsiLCIvKiBCREV2ZW50cyAqL1xyXG5jb25zdCBFdmVudEVtaXR0ZXIgPSByZXF1aXJlKFwiZXZlbnRzXCIpO1xyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQkRFdmVudHMgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgZGlzcGF0Y2goZXZlbnROYW1lLCAuLi5hcmdzKSB7dGhpcy5lbWl0KGV2ZW50TmFtZSwgLi4uYXJncyk7fVxyXG4gICAgb2ZmKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pIHt0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgZXZlbnRBY3Rpb24pO31cclxufTsiLCIvKipcclxuICogQ3JlZGl0cyB0byBAaGVsbGJvdW5kMTMzNyBvbiBnaXRodWIgZm9yIHRoZSBjc3NcclxuICovXHJcblxyXG5pbXBvcnQgRE9NVG9vbHMgZnJvbSBcIi4vZG9tdG9vbHNcIlxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIlxyXG5cclxubGV0IHNlbGVjdG9yc1xyXG5jb25zdCByZW1vdmVEYSA9IFV0aWxzLnJlbW92ZURhXHJcbmZ1bmN0aW9uIGdldFNlbGVjdG9ycygpe1xyXG4gICAgbGV0IHN0YW5kYXJkU2lkZWJhclZpZXcgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgaWYoIXN0YW5kYXJkU2lkZWJhclZpZXcpcmV0dXJuIG51bGxcclxuICAgIGxldCBkZWZhdWx0Q2xhc3NOYW1lID0gcmVtb3ZlRGEoc3RhbmRhcmRTaWRlYmFyVmlldy5zdGFuZGFyZFNpZGViYXJWaWV3KVxyXG4gICAgbGV0IHNlbGVjdHMgPSBbXVxyXG4gICAgc2VsZWN0cy5wdXNoKGAjYXBwLW1vdW50IC4ke2RlZmF1bHRDbGFzc05hbWV9IC5wYXltZW50LWluZm8gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuZGVzY3JpcHRpb24gJiYgdHlwZW9mIGUuZGVzY3JpcHRpb24gPT09IFwic3RyaW5nXCIgJiYgZS5kZXNjcmlwdGlvbi5pbmNsdWRlcyhcImZvcm1UZXh0XCIpKVswXS5kZXNjcmlwdGlvbil9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wYXltZW50U291cmNlUm93KVswXS5wYXltZW50U291cmNlUm93KX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc3ViVGV4dCAmJiBlLmRlc2NyaXB0aW9uV3JhcHBlcilbMF0uc3ViVGV4dCl9YClcclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAuJHtyZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyU2V0dGluZ3NBY2NvdW50KVswXS51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgIHJldHVybiBzZWxlY3RzXHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCbHVyUHJpdmF0ZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuICAgICAgICBzZWxlY3RvcnMgPSBzZWxlY3RvcnMgfHwgZ2V0U2VsZWN0b3JzKClcclxuXHJcbiAgICAgICAgaWYoIXNlbGVjdG9ycyljb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgc2VsZWN0b3JzIHRvIGJsdXIgcGVyc29ubmFsIGluZm9ybWF0aW9ucy5cIikpXHJcbiAgICAgICAgRE9NVG9vbHMuYWRkU3R5bGUoXCJibHVyUHJpdmF0ZVwiLCBgXHJcbiR7c2VsZWN0b3JzWzBdfSwgJHtzZWxlY3RvcnNbMV19LCAke3NlbGVjdG9yc1syXX0ge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA4NSwuNjgsLjUzKTtcclxuICAgIGZpbHRlcjogYmx1cig0cHgpO1xyXG4gICAgb3BhY2l0eTogLjg7XHJcbn1cclxuXHJcbiR7c2VsZWN0b3JzWzBdfTpob3ZlciwgJHtzZWxlY3RvcnNbMV19OmhvdmVyLCAke3NlbGVjdG9yc1syXX06aG92ZXIge1xyXG4gICAgdHJhbnNpdGlvbjogYWxsIDE1MG1zIGN1YmljLWJlemllciguNTUsLjA5LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBub25lO1xyXG4gICAgb3BhY2l0eTogMTtcclxufWApXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBET01Ub29scy5yZW1vdmVTdHlsZShcImJsdXJQcml2YXRlXCIpXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuXHJcbmNvbnN0IG5vcm1hbGl6ZWRQcmVmaXggPSBcImRhXCI7XHJcbmNvbnN0IHJhbmRDbGFzcyA9IG5ldyBSZWdFeHAoYF4oPyEke25vcm1hbGl6ZWRQcmVmaXh9LSkoKD86W0EtWmEtel18WzAtOV18LSkrKS0oPzpbQS1aYS16XXxbMC05XXwtfF8pezZ9JGApO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIENsYXNzTm9ybWFsaXplciB7XHJcblxyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzUGF0Y2hlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLnJldmVydEVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGVzKFdlYnBhY2tNb2R1bGVzLmZpbmRBbGwodGhpcy5tb2R1bGVGaWx0ZXIuYmluZCh0aGlzKSkpO1xyXG4gICAgICAgIHRoaXMubm9ybWFsaXplRWxlbWVudChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKSk7XHJcbiAgICAgICAgdGhpcy5oYXNQYXRjaGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLnBhdGNoRE9NTWV0aG9kcygpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGVzKG1vZHVsZXMpIHtcclxuICAgICAgICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBtb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMudW5wYXRjaENsYXNzTW9kdWxlKG5vcm1hbGl6ZWRQcmVmaXgsIG1vZHVsZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNob3VsZElnbm9yZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghaXNOYU4odmFsdWUpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuZW5kc1dpdGgoXCJweFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImNoXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwiZW1cIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJtc1wiKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoXCJsYXllckNvbnRhaW5lci1cIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSAmJiAodmFsdWUubGVuZ3RoID09IDcgfHwgdmFsdWUubGVuZ3RoID09IDQpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuaW5jbHVkZXMoXCJjYWxjKFwiKSB8fCB2YWx1ZS5pbmNsdWRlcyhcInJnYmFcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBtb2R1bGVGaWx0ZXIobW9kdWxlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiBtb2R1bGUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShtb2R1bGUpKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKG1vZHVsZS5fX2VzTW9kdWxlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgaWYgKCFPYmplY3Qua2V5cyhtb2R1bGUpLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBtb2R1bGUpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBtb2R1bGVbYmFzZUNsYXNzTmFtZV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zcGxpdChcIi1cIikubGVuZ3RoID09PSAxKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QodmFsdWUuc3BsaXQoXCIgXCIpWzBdKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdmFsdWUuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5vcm1hbENsYXNzIG9mIGNsYXNzTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBub3JtYWxDbGFzcy5tYXRjaChyYW5kQ2xhc3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaCB8fCAhbWF0Y2gubGVuZ3RoIHx8IG1hdGNoLmxlbmd0aCA8IDIpIGNvbnRpbnVlOyAvLyBTaG91bGRuJ3QgZXZlciBoYXBwZW4gc2luY2UgdGhleSBwYXNzZWQgdGhlIG1vZHVsZUZpbHRlciwgYnV0IHlvdSBuZXZlciBrbm93XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjYW1lbENhc2UgPSBtYXRjaFsxXS5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdICs9IGAgJHtjb21wb25lbnROYW1lfS0ke2NhbWVsQ2FzZX1gO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVucGF0Y2hDbGFzc01vZHVsZShjb21wb25lbnROYW1lLCBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBiYXNlQ2xhc3NOYW1lIGluIGNsYXNzTmFtZXMpIHtcclxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaG91bGRJZ25vcmUodmFsdWUpKSBjb250aW51ZTtcclxuICAgICAgICAgICAgbGV0IG5ld1N0cmluZyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub3JtYWxDbGFzcy5zdGFydHNXaXRoKGAke2NvbXBvbmVudE5hbWV9LWApKSBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIG5ld1N0cmluZyArPSBgICR7bm9ybWFsQ2xhc3N9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjbGFzc05hbWVzW2Jhc2VDbGFzc05hbWVdID0gbmV3U3RyaW5nLnRyaW0oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm9ybWFsaXplRWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwLCBjbGVuID0gY2xhc3Nlcy5sZW5ndGg7IGMgPCBjbGVuOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKCFyYW5kQ2xhc3MudGVzdChjbGFzc2VzW2NdKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY2xhc3Nlc1tjXS5tYXRjaChyYW5kQ2xhc3MpWzFdO1xyXG4gICAgICAgICAgICBjb25zdCBuZXdDbGFzcyA9IG1hdGNoLnNwbGl0KFwiLVwiKS5tYXAoKHMsIGkpID0+IGkgPyBzWzBdLnRvVXBwZXJDYXNlKCkgKyBzLnNsaWNlKDEpIDogcykuam9pbihcIlwiKTtcclxuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGAke25vcm1hbGl6ZWRQcmVmaXh9LSR7bmV3Q2xhc3N9YCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgZWxlbWVudC5jaGlsZHJlbikgdGhpcy5ub3JtYWxpemVFbGVtZW50KGNoaWxkKTtcclxuICAgIH1cclxuXHJcbiAgICByZXZlcnRFbGVtZW50KGVsZW1lbnQpIHtcclxuICAgICAgICBpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybjtcclxuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCkgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQuY2hpbGRyZW5bMF0pO1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZykgdGhpcy5yZXZlcnRFbGVtZW50KGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICBjb25zdCBjbGFzc2VzID0gZWxlbWVudC5jbGFzc0xpc3Q7XHJcbiAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgaWYgKGNsYXNzZXNbY10uc3RhcnRzV2l0aChgJHtub3JtYWxpemVkUHJlZml4fS1gKSkgdG9SZW1vdmUucHVzaChjbGFzc2VzW2NdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKC4uLnRvUmVtb3ZlKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaERPTU1ldGhvZHMoKSB7XHJcbiAgICAgICAgY29uc3QgY29udGFpbnMgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUuY29udGFpbnMgPSBmdW5jdGlvbih0b2tlbikge1xyXG4gICAgICAgICAgICAvLyBjb25zdCB0b2tlbnMgPSB0b2tlbi5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KGNvbnRhaW5zLCB0aGlzLCBbdG9rZW4uc3BsaXQoXCIgXCIpWzBdXSk7XHJcbiAgICAgICAgICAgIC8vIHJldHVybiB0b2tlbnMuZXZlcnkodCA9PiBjb250YWlucy5jYWxsKHRoaXMsIHQpKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBhZGQgPSBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZDtcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKC4uLnRva2Vucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykge1xyXG4gICAgICAgICAgICAgICAgdG9rZW5zW3RdID0gdG9rZW5zW3RdLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShhZGQsIHRoaXMsIHRva2Vucyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgcmVtb3ZlID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmU7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkocmVtb3ZlLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb2xvcmVkVGV4dCB7XHJcbiAgICBpbmplY3RDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBpZiAodGhpcy5jYW5jZWxDb2xvcmVkVGV4dCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuY2FuY2VsQ29sb3JlZFRleHQgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdO1xyXG4gICAgICAgICAgICBpZiAoIXByb3BzIHx8ICFwcm9wcy5jaGlsZHJlbk1lc3NhZ2VDb250ZW50KSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDb250ZW50ID0gcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudDtcclxuXHJcbiAgICAgICAgICAgIGlmICghbWVzc2FnZUNvbnRlbnQudHlwZSB8fCAhbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlIHx8IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZS5kaXNwbGF5TmFtZSAhPSBcIk1lc3NhZ2VDb250ZW50XCIpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUeXBlID0gbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlO1xyXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxUeXBlLl9fb3JpZ2luYWxNZXRob2QpIHJldHVybjsgLy8gRG9uJ3QgcGF0Y2ggYWdhaW5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlID0gZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxUeXBlKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVDb2xvciA9IHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0gPyBwcm9wcy5tZXNzYWdlLmNvbG9yU3RyaW5nIHx8IFwiXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuc3R5bGUgPSB7Y29sb3I6IHJvbGVDb2xvcn07XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuX19vcmlnaW5hbE1ldGhvZCA9IG9yaWdpbmFsVHlwZTtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihtZXNzYWdlQ29udGVudC50eXBlLnR5cGUsIG9yaWdpbmFsVHlwZSk7XHJcbiAgICAgICAgfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZUNvbG9yZWRUZXh0KCkge1xyXG4gICAgICAgIGxldCBjbGFzc05hbWVNYXJrdXAgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdLm1hcmt1cFxyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuXCIrY2xhc3NOYW1lTWFya3VwLnNwbGl0KFwiIFwiKVswXSkuZm9yRWFjaChlbGVtID0+IHtcclxuICAgICAgICAgICAgZWxlbS5zdHlsZS5zZXRQcm9wZXJ0eShcImNvbG9yXCIsIFwiXCIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIGJkcGx1Z2lucywgYmR0aGVtZXN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCJcclxuXHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IE1vZHVsZSA9IHJlcXVpcmUoXCJtb2R1bGVcIikuTW9kdWxlO1xyXG5Nb2R1bGUuZ2xvYmFsUGF0aHMucHVzaChwYXRoLnJlc29sdmUocmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHAuZ2V0QXBwUGF0aCgpLCBcIm5vZGVfbW9kdWxlc1wiKSk7XHJcbmNsYXNzIE1ldGFFcnJvciBleHRlbmRzIEVycm9yIHtcclxuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcclxuICAgICAgICBzdXBlcihtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIk1ldGFFcnJvclwiO1xyXG4gICAgfVxyXG59XHJcbmNvbnN0IG9yaWdpbmFsSlNSZXF1aXJlID0gTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdO1xyXG5jb25zdCBvcmlnaW5hbENTU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID8gTW9kdWxlLl9leHRlbnNpb25zW1wiLmNzc1wiXSA6ICgpID0+IHtyZXR1cm4gbnVsbDt9O1xyXG5jb25zdCBzcGxpdFJlZ2V4ID0gL1teXFxTXFxyXFxuXSo/KD86XFxyXFxufFxcbilbXlxcU1xcclxcbl0qP1xcKlteXFxTXFxyXFxuXT8vO1xyXG5jb25zdCBlc2NhcGVkQXRSZWdleCA9IC9eXFxcXEAvO1xyXG5cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDb250ZW50TWFuYWdlciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy50aW1lQ2FjaGUgPSB7fTtcclxuICAgICAgICB0aGlzLndhdGNoZXJzID0ge307XHJcbiAgICAgICAgTW9kdWxlLl9leHRlbnNpb25zW1wiLmpzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInBsdWdpblwiKTtcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdID0gdGhpcy5nZXRDb250ZW50UmVxdWlyZShcInRoZW1lXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwbHVnaW5zRm9sZGVyKCkge3JldHVybiB0aGlzLl9wbHVnaW5zRm9sZGVyIHx8ICh0aGlzLl9wbHVnaW5zRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwicGx1Z2lucy9cIikpKTt9XHJcbiAgICBnZXQgdGhlbWVzRm9sZGVyKCkge3JldHVybiB0aGlzLl90aGVtZXNGb2xkZXIgfHwgKHRoaXMuX3RoZW1lc0ZvbGRlciA9IGZzLnJlYWxwYXRoU3luYyhwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGggKyBcInRoZW1lcy9cIikpKTt9XHJcblxyXG4gICAgd2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSBjb250ZW50VHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdID0gZnMud2F0Y2goYmFzZUZvbGRlciwge3BlcnNpc3RlbnQ6IGZhbHNlfSwgYXN5bmMgKGV2ZW50VHlwZSwgZmlsZW5hbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudFR5cGUgfHwgIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgdHJ5IHtmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgcmV0dXJuIHBsdWdpbk1vZHVsZS51bmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpLmlzRmlsZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLm10aW1lIHx8ICFzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihzdGF0cy5tdGltZS5nZXRUaW1lKCkpICE9PSBcIm51bWJlclwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9IHN0YXRzLm10aW1lLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcInJlbmFtZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLnJlbG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLnJlbG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVud2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XHJcbiAgICAgICAgaWYgKGhhc09sZE1ldGEpIHJldHVybiB0aGlzLnBhcnNlT2xkTWV0YShjb250ZW50KTtcclxuICAgICAgICBjb25zdCBoYXNOZXdNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLyoqXCIpO1xyXG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VPbGRNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBtZXRhID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xyXG4gICAgICAgIGlmIChtZXRhLmluZGV4T2YoXCJNRVRBXCIpIDwgMCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbHMudGVzdEpTT04ocmF3TWV0YSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xyXG4gICAgICAgIGlmICghcGFyc2VkLm5hbWUpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIG1pc3NpbmcgbmFtZSBkYXRhLlwiKTtcclxuICAgICAgICBwYXJzZWQuZm9ybWF0ID0gXCJqc29uXCI7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5zcGxpdChcIi8qKlwiLCAyKVsxXS5zcGxpdChcIiovXCIsIDEpWzBdO1xyXG4gICAgICAgIGNvbnN0IG91dCA9IHt9O1xyXG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGFjY3VtID0gXCJcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2suc3BsaXQoc3BsaXRSZWdleCkpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09PSBcIkBcIiAmJiBsaW5lLmNoYXJBdCgxKSAhPT0gXCIgXCIpIHtcclxuICAgICAgICAgICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xyXG4gICAgICAgICAgICAgICAgZmllbGQgPSBsaW5lLnN1YnN0cigxLCBsIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSA9IGxpbmUuc3Vic3RyKGwgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtICs9IFwiIFwiICsgbGluZS5yZXBsYWNlKFwiXFxcXG5cIiwgXCJcXG5cIikucmVwbGFjZShlc2NhcGVkQXRSZWdleCwgXCJAXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bS50cmltKCk7XHJcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcclxuICAgICAgICBvdXQuZm9ybWF0ID0gXCJqc2RvY1wiO1xyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudFJlcXVpcmUodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBpc1BsdWdpbiA/IG9yaWdpbmFsSlNSZXF1aXJlIDogb3JpZ2luYWxDU1NSZXF1aXJlO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHNlbGYucGx1Z2luc0ZvbGRlciA6IHNlbGYudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZVBhdGggPSBwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgcGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIFwidXRmOFwiKTtcclxuICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLnN0cmlwQk9NKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzZWxmLmV4dHJhY3RNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIG1ldGEuYWRkZWQgPSBzdGF0cy5hdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLm1vZGlmaWVkID0gc3RhdHMubXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcclxuICAgICAgICAgICAgaWYgKCFpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5jc3MgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYG1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBtb2R1bGUuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkRXhwb3J0ID0gIVV0aWxzLmlzRW1wdHkobW9kdWxlLmV4cG9ydHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGEudHlwZSA9IG1vZHVsZS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbWV0YTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgXFxubW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtcXG5tb2R1bGUuZXhwb3J0cy50eXBlID0gJHttZXRhLmV4cG9ydHMgfHwgbWV0YS5uYW1lfTtgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBmaWxlbmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlUGxhY2Vob2xkZXJQbHVnaW4oZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICBnZXROYW1lOiAoKSA9PiB7cmV0dXJuIGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lO30sXHJcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb246ICgpID0+IHtyZXR1cm4gZGF0YS5tZXNzYWdlID8gZGF0YS5tZXNzYWdlIDogXCJUaGlzIHBsdWdpbiB3YXMgdW5hYmxlIHRvIGJlIGxvYWRlZC4gQ2hlY2sgdGhlIGF1dGhvcidzIHBhZ2UgZm9yIHVwZGF0ZXMuXCI7fSxcclxuICAgICAgICAgICAgICAgIGdldFZlcnNpb246ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBmaWxlbmFtZTogZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcclxuICAgICAgICAgICAgd2Vic2l0ZTogZGF0YS53ZWJzaXRlID8gZGF0YS53ZWJzaXRlIDogXCJcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbXBpbGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gd2luZG93LnJlcXVpcmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IHttZXNzYWdlOiBcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIiwgc3RhY2s6IFwiQ2Fubm90IHJlYWQgcHJvcGVydHkgJ3JlcGxhY2UnIG9mIHVuZGVmaW5lZFwifX1cclxuICAgICAgICBjb250ZW50LmlkID0gVXRpbHMuZXNjYXBlSUQoY29udGVudC5uYW1lKTtcclxuICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgaWYgKCFjb250ZW50LnR5cGUpIHJldHVybjtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnRlbnQucGx1Z2luID0gbmV3IGNvbnRlbnQudHlwZSgpO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGJkcGx1Z2luc1tjb250ZW50LnBsdWdpbi5nZXROYW1lKCldO1xyXG4gICAgICAgICAgICAgICAgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV0gPSBjb250ZW50O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge3JldHVybiB7bmFtZTogZmlsZW5hbWUsIGZpbGU6IGZpbGVuYW1lLCBtZXNzYWdlOiBcIkNvdWxkIG5vdCBiZSBjb25zdHJ1Y3RlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnJvci5tZXNzYWdlLCBzdGFjazogZXJyb3Iuc3RhY2t9fTt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgYmR0aGVtZXNbY29udGVudC5uYW1lXTtcclxuICAgICAgICAgICAgYmR0aGVtZXNbY29udGVudC5uYW1lXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgfSAgIFxyXG5cclxuICAgIHVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5yZXF1aXJlLmNhY2hlW3dpbmRvdy5yZXF1aXJlLnJlc29sdmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSldO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIHVubG9hZGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX07fVxyXG4gICAgfVxyXG5cclxuICAgIGlzTG9hZGVkKGZpbGVuYW1lLCB0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIHRyeSB7d2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07fVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4gZmFsc2U7fVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBjYW50VW5sb2FkID0gdGhpcy51bmxvYWRDb250ZW50KGZpbGVuYW1lLCB0eXBlKTtcclxuICAgICAgICBpZiAoY2FudFVubG9hZCkgcmV0dXJuIGNhbnRVbmxvYWQ7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWROZXdDb250ZW50KHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgZmlsZUVuZGluZyA9IGlzUGx1Z2luID8gXCIucGx1Z2luLmpzXCIgOiBcIi50aGVtZS5jc3NcIjtcclxuICAgICAgICBjb25zdCBiYXNlZGlyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlcyA9IGZzLnJlYWRkaXJTeW5jKGJhc2VkaXIpO1xyXG4gICAgICAgIGNvbnN0IGNvbnRlbnRMaXN0ID0gT2JqZWN0LnZhbHVlcyhpc1BsdWdpbiA/IGJkcGx1Z2lucyA6IGJkdGhlbWVzKTtcclxuICAgICAgICBjb25zdCByZW1vdmVkID0gY29udGVudExpc3QuZmlsdGVyKHQgPT4gIWZpbGVzLmluY2x1ZGVzKHQuZmlsZW5hbWUpKS5tYXAoYyA9PiBpc1BsdWdpbiA/IGMucGx1Z2luLmdldE5hbWUoKSA6IGMubmFtZSk7XHJcbiAgICAgICAgY29uc3QgYWRkZWQgPSBmaWxlcy5maWx0ZXIoZiA9PiAhY29udGVudExpc3QuZmluZCh0ID0+IHQuZmlsZW5hbWUgPT0gZikgJiYgZi5lbmRzV2l0aChmaWxlRW5kaW5nKSAmJiBmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZWRpciwgZikpLmlzRmlsZSgpKTtcclxuICAgICAgICByZXR1cm4ge2FkZGVkLCByZW1vdmVkfTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBsb2FkQWxsQ29udGVudCh0eXBlKSB7XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGx1Z2lucygpIHtyZXR1cm4gdGhpcy5sb2FkQWxsQ29udGVudChcInBsdWdpblwiKTt9XHJcbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxyXG59OyIsImltcG9ydCB7YmRDb25maWcsIG1pblN1cHBvcnRlZFZlcnNpb24sIGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbkVycm9ycywgYmR0aGVtZUVycm9ycywgYmJkQ2hhbmdlbG9nLCBkZWZhdWx0Q29va2llLCBjdXJyZW50RGlzY29yZFZlcnNpb24sIGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IEJETG9nbyBmcm9tIFwiLi4vdWkvYmRMb2dvXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9saWdodGNvcmRcIjtcclxuaW1wb3J0IFBsdWdpbkNlcnRpZmllciBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xyXG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxyXG5pbXBvcnQge3JlbW90ZSBhcyBlbGVjdHJvbn0gZnJvbSBcImVsZWN0cm9uXCJcclxuXHJcbmZ1bmN0aW9uIENvcmUoKSB7XHJcbiAgICAvLyBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyhEYXRhU3RvcmUuY29uZmlnRmlsZSkpO1xyXG4gICAgLy8gdGhpcy5pbml0KCk7XHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnNldENvbmZpZyA9IGZ1bmN0aW9uKGNvbmZpZykge1xyXG4gICAgT2JqZWN0LmFzc2lnbihiZENvbmZpZywgY29uZmlnKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXQgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGlmICghQXJyYXkucHJvdG90eXBlLmZsYXQpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJiZFZlcnNpb24gKyBcIiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb2xkIHZlcnNpb24gKFwiICsgY3VycmVudERpc2NvcmRWZXJzaW9uICsgXCIpIG9mIERpc2NvcmQuIFBsZWFzZSB1cGRhdGUgeW91ciBEaXNjb3JkIGluc3RhbGxhdGlvbiBiZWZvcmUgcHJvY2VlZGluZy5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChiZENvbmZpZy52ZXJzaW9uIDwgbWluU3VwcG9ydGVkVmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJldHRlckRpc2NvcmQgdlwiICsgYmRDb25maWcudmVyc2lvbiArIFwiICh5b3VyIHZlcnNpb24pXCIgKyBcIiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBsYXRlc3QganMgKFwiICsgYmJkVmVyc2lvbiArIFwiKS48YnI+PGJyPiBQbGVhc2UgZG93bmxvYWQgdGhlIGxhdGVzdCB2ZXJzaW9uIGZyb20gPGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5HaXRIdWI8L2E+XCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAod2luZG93LkVEKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggRW5oYW5jZWREaXNjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5XZWJTb2NrZXQgJiYgd2luZG93LldlYlNvY2tldC5uYW1lICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZS5pbmNsdWRlcyhcIlBhdGNoZWRcIikpIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCYW5kYWdlZEJEIGRvZXMgbm90IHdvcmsgd2l0aCBQb3dlcmNvcmQuIFBsZWFzZSB1bmluc3RhbGwgb25lIG9mIHRoZW0uXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgY29uc3QgbGF0ZXN0TG9jYWxWZXJzaW9uID0gYmRDb25maWcudXBkYXRlciA/IGJkQ29uZmlnLnVwZGF0ZXIuTGF0ZXN0VmVyc2lvbiA6IGJkQ29uZmlnLmxhdGVzdFZlcnNpb247XHJcbiAgICBpZiAobGF0ZXN0TG9jYWxWZXJzaW9uID4gYmRDb25maWcudmVyc2lvbikge1xyXG4gICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcIlVwZGF0ZSBBdmFpbGFibGVcIiwgW2BUaGVyZSBpcyBhbiB1cGRhdGUgYXZhaWxhYmxlIGZvciBCYW5kYWdlZEJEJ3MgSW5qZWN0b3IgKCR7bGF0ZXN0TG9jYWxWZXJzaW9ufSkuYCwgXCJZb3UgY2FuIGVpdGhlciB1cGRhdGUgYW5kIHJlc3RhcnQgbm93LCBvciBsYXRlci5cIl0sIHtcclxuICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiVXBkYXRlIE5vd1wiLFxyXG4gICAgICAgICAgICBjYW5jZWxUZXh0OiBcIk1heWJlIExhdGVyXCIsXHJcbiAgICAgICAgICAgIG9uQ29uZmlybTogYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb25VcGRhdGVGYWlsZWQgPSAoKSA9PiB7VXRpbHMuYWxlcnQoXCJDb3VsZCBOb3QgVXBkYXRlXCIsIGBVbmFibGUgdG8gdXBkYXRlIGF1dG9tYXRpY2FsbHksIHBsZWFzZSBkb3dubG9hZCB0aGUgaW5zdGFsbGVyIGFuZCByZWluc3RhbGwgbm9ybWFsbHkuPGJyIC8+PGJyIC8+PGEgaHJlZj0naHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC9yZWxlYXNlcy9sYXRlc3QnIHRhcmdldD0nX2JsYW5rJz5Eb3dubG9hZCBJbnN0YWxsZXI8L2E+YCk7fTtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlkVXBkYXRlID0gYXdhaXQgdGhpcy51cGRhdGVJbmplY3RvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghZGlkVXBkYXRlKSByZXR1cm4gb25VcGRhdGVGYWlsZWQoKTtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHAgPSByZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcDtcclxuICAgICAgICAgICAgICAgICAgICBhcHAucmVsYXVuY2goKTtcclxuICAgICAgICAgICAgICAgICAgICBhcHAuZXhpdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgIG9uVXBkYXRlRmFpbGVkKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH0qL1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgU2V0dGluZ3NcIik7XHJcbiAgICB0aGlzLmluaXRTZXR0aW5ncygpO1xyXG5cclxuICAgIGF3YWl0IHRoaXMuY2hlY2tGb3JHdWlsZHMoKTtcclxuICAgIEJEVjIuaW5pdGlhbGl6ZSgpO1xyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlVwZGF0aW5nIFNldHRpbmdzXCIpO1xyXG4gICAgc2V0dGluZ3NQYW5lbC5pbml0aWFsaXplU2V0dGluZ3MoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBQbHVnaW5zXCIpO1xyXG4gICAgYXdhaXQgcGx1Z2luTW9kdWxlLmxvYWRQbHVnaW5zKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkxvYWRpbmcgVGhlbWVzXCIpO1xyXG4gICAgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lcygpO1xyXG5cclxuICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCBhdG9iKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSkpO1xyXG5cclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1kYy0wXCJdKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJ0bi5idG4tZGlzY29ubmVjdFwiKS5jbGljaygpO1xyXG4gICAgfSk7XHJcblxyXG4gICAgUGx1Z2luQ2VydGlmaWVyLnN0YXJ0KClcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiUmVtb3ZpbmcgTG9hZGluZyBJY29uXCIpO1xyXG4gICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKS5sZW5ndGgpIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJiZC1sb2FkZXJ2MlwiKVswXS5yZW1vdmUoKTtcclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJJbml0aWFsaXppbmcgTWFpbiBPYnNlcnZlclwiKTtcclxuICAgIHRoaXMuaW5pdE9ic2VydmVyKCk7XHJcblxyXG4gICAgLy8gU2hvdyBsb2FkaW5nIGVycm9yc1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSB7XHJcbiAgICAgICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkNvbGxlY3RpbmcgU3RhcnR1cCBFcnJvcnNcIik7XHJcbiAgICAgICAgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IGJkcGx1Z2luRXJyb3JzLCB0aGVtZXM6IGJkdGhlbWVFcnJvcnN9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBwcmV2aW91c1ZlcnNpb24gPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwidmVyc2lvblwiKTtcclxuICAgIGlmIChiYmRWZXJzaW9uID4gcHJldmlvdXNWZXJzaW9uKSB7XHJcbiAgICAgICAgaWYgKGJiZENoYW5nZWxvZykgdGhpcy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwidmVyc2lvblwiLCBiYmRWZXJzaW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBFbW9qaU1vZHVsZS5zdGFydCgpXHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaFNvY2lhbC5iaW5kKHRoaXMpLCBcIkJEIFNvY2lhbCBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkUGlsbHMuYmluZCh0aGlzKSwgXCJCRCBHdWlsZCBQaWxscyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkTGlzdEl0ZW1zLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgTGlzdCBJdGVtcyBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEd1aWxkU2VwYXJhdG9yLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgU2VwYXJhdG9yIFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVzc2FnZUhlYWRlci5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIENoYXQgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hNZW1iZXJMaXN0LmJpbmQodGhpcyksIFwiQkQgQmFkZ2UgTWVtYmVyIExpc3QgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hBdHRhY2htZW50LmJpbmQodGhpcyksIFwiTEMgUGx1Z2luIENlcnRpZmllciBQYXRjaFwiKSgpO1xyXG5cclxuICAgIGlmKGJkQ29uZmlnLmhhdmVJbnN0YWxsZWREZWZhdWx0KXtcclxuICAgICAgICBsZXQgYWxlcnQgPSBVdGlscy5hbGVydChcIkZpcnN0IEluc3RhbGxhdGlvblwiLCBcIkFzIGl0IGlzIHRoZSBmaXJzdCB0aW1lIHlvdSBpbnN0YWxsIExpZ2h0Y29yZCwgV2UgYWRkZWQgdHdvIGRlZmF1bHQgdGhlbWVzIGFuZCBvbmUgZGVmYXVsdCBwbHVnaW4gaW4geW91ciBwbHVnaW4vdGhlbWUgZm9sZGVyLiBDaGVjayBpdCBpbiB0aGUgUGx1Z2luL1RoZW1lIHNldHRpbmdzLlwiKVxyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGFsZXJ0Lm9uQ2xvc2UocmVzb2x2ZSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgY29uc3QgbG9nbyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50ID4gZGl2LnR5cGVXaW5kb3dzLTF6YS1uNy53aXRoRnJhbWUtaGFZbHRJLnRpdGxlQmFyLUFDNHBHVi5ob3Jpem9udGFsUmV2ZXJzZS0zdFJqWTcuZmxleC0xTzFHS1kuZGlyZWN0aW9uUm93UmV2ZXJzZS1tOElqSXEuanVzdGlmeVN0YXJ0LTJOREZ6aS5hbGlnblN0cmV0Y2gtRHBHUGYzLmRhLXR5cGVXaW5kb3dzLmRhLXdpdGhGcmFtZS5kYS10aXRsZUJhci5kYS1ob3Jpem9udGFsUmV2ZXJzZS5kYS1mbGV4LmRhLWRpcmVjdGlvblJvd1JldmVyc2UuZGEtanVzdGlmeVN0YXJ0LmRhLWFsaWduU3RyZXRjaCA+IGRpdi53b3JkbWFya1dpbmRvd3MtMXYwbFlELndvcmRtYXJrLTJpRERmbS5kYS13b3JkbWFya1dpbmRvd3MuZGEtd29yZG1hcmtcIilcclxuICAgIGlmKGxvZ28pe1xyXG4gICAgICAgIGxvZ28uc3R5bGUudG9wID0gXCIzcHhcIlxyXG4gICAgICAgIGxvZ28uaW5uZXJIVE1MID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGhlaWdodD1cIjEwXCIgd2lkdGg9XCI3MFwiIHZpZXdCb3g9XCIwIDAgNzIuNTQgMTBcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAtNXB4LCBtYXJnaW4tdG9wOiAxMHB4XCI+XHJcbiAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk00NC44MSw5LjY3VjYuMzNjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MUEzLjUzLDMuNTMsMCwwLDAsNDYuMiwzYy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5LjY3YzAsMi4yMSwxLjg5LDMuMzMsMy43NywzLjMzYTMuODcsMy44NywwLDAsMCwzLjQ1LTIuMThsLTIuMTItMUM0NywxMS4xNyw0NC44MSwxMC44NSw0NC44MSw5LjY3Wk0xMC42OCwxMi44OWgyLjQxVjMuMTdIMTAuNjhaTTcxLjc2LDMuMTRINjguMTlWNy4yM0w3MC41Nyw5LjR2LTRoMS4yN2MuODEsMCwxLjIxLjQxLDEuMjEsMXYzYzAsLjYzLS4zOCwxLjA1LTEuMjEsMS4wNUg2OC4xOHYyLjMxaDMuNTdjMS45MiwwLDMuNzItMSwzLjcyLTMuMlY2LjM5Qzc1LjQ4LDQuMTMsNzMuNjgsMy4xNCw3MS43NiwzLjE0Wk01NC4yMiwzYy0yLDAtNCwxLjEtNCwzLjM0VjkuNjZjMCwyLjIzLDIsMy4zNCw0LDMuMzRzMy45NS0xLjExLDMuOTUtMy4zNFY2LjM0QzU4LjE5LDQuMTEsNTYuMiwzLDU0LjIyLDNabTEuNTUsNi42NmMwLC43LS43OCwxLjA2LTEuNTQsMS4wNnMtMS41NS0uMzUtMS41NS0xLjA2VjYuMzRjMC0uNzIuNzUtMS4xLDEuNS0xLjFzMS41OS4zNSwxLjU5LDEuMVpNNjYuODQsNi4zNGMwLTIuMjktMS41OC0zLjItMy41NS0zLjJINTkuNDZ2OS43M2gyLjQ1VjkuNzdoLjQzbDIuMjIsMy4wOWgzTDY1LDkuNTJDNjYuMTMsOS4xNSw2Ni44NCw4LjE0LDY2Ljg0LDYuMzRaTTYzLjMzLDcuNjVINjEuOTFWNS40M2gxLjQyQTEuMTEsMS4xMSwwLDEsMSw2My4zMyw3LjY1Wk0yOS44MywxM2gyLjQyVjMuMDZIMjkuODNWNi43M2wtMywwVjMuMDlIMjQuN3Y5Ljc4aDIuMTRWOC42OGwzLDBaTTE3LjE2LDkuNzZWNi40MmMwLTEuMjEsMi4xMy0xLjQ5LDIuNzgtLjI4bDItLjgxYTMuNTUsMy41NSwwLDAsMC0zLjM2LTIuMjRjLTEuOTIsMC0zLjgxLDEuMTMtMy44MSwzLjMzVjkuNzZjMCwyLjIxLDIsMy4xNSwzLjksMy4xNXMzLjU4LTEsMy41OC0zVjcuNThIMTguNzlsMCwxLjM2SDIwLjN2Ljc3QzIwLjMsMTAuOTIsMTcuMTYsMTAuOTQsMTcuMTYsOS43NlpcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTIuOTMgLTMpXCIvPlxyXG4gICAgPHBvbHlnb24gZmlsbD1cImN1cnJlbnRDb2xvclwiIHBvaW50cz1cIjM1LjkxIDAuMDYgMzguNDMgMC4wNiAzOC40MyAxLjg0IDM1LjkyIDEuODEgMzUuOTcgMTAgMzMuNTUgMTAgMzMuNDkgMS43NSAzMC45OCAxLjc0IDMwLjk4IDAuMDYgMzMuNDkgMC4wNiAzNS45MSAwLjA2XCIvPlxyXG4gICAgPHBvbHlnb24gZmlsbD1cImN1cnJlbnRDb2xvclwiIHBvaW50cz1cIjAgOS45NyA2LjUgMTAgNi41IDcuNjMgMi40MSA3LjYzIDIuNDEgMC4yNiAwIDIuMjYgMCA5Ljk3XCIvPlxyXG48L3N2Zz5gXHJcbiAgICB9XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5jaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgbGV0IHRpbWVzQ2hlY2tlZCA9IDA7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hlY2tGb3JHdWlsZHMgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IEJEVjIuZ3VpbGRDbGFzc2VzLndyYXBwZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn1gKS5sZW5ndGggPiAwKSB0aW1lc0NoZWNrZWQrKztcclxuICAgICAgICAgICAgY29uc3QgZ3VpbGQgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBCRFYyLmd1aWxkQ2xhc3Nlcy5ibG9iQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3dyYXBwZXJ9IC4ke2d1aWxkfSAuJHtibG9ifWApLmxlbmd0aCA+IDApIHJldHVybiByZXNvbHZlKGJkQ29uZmlnLmRlZmVyTG9hZGVkID0gdHJ1ZSk7XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKHRpbWVzQ2hlY2tlZCA+PSA1MCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dChjaGVja0Zvckd1aWxkcywgMTAwKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlICE9IFwibG9hZGluZ1wiKSBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO30pO1xyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbmplY3RFeHRlcm5hbHMgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGF3YWl0IERPTS5hZGRTY3JpcHQoXCJhY2Utc2NyaXB0XCIsIFwiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvYWNlLzEuMi45L2FjZS5qc1wiKTtcclxuICAgIGlmICh3aW5kb3cucmVxdWlyZS5vcmlnaW5hbCkgd2luZG93LnJlcXVpcmUgPSB3aW5kb3cucmVxdWlyZS5vcmlnaW5hbDtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRTZXR0aW5ncyA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgICBpZighRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpICYmICFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKXtcclxuICAgICAgICBpZiAoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBkZWZhdWx0Q29va2llKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIGRlZmF1bHRSUEMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgICBzZXR0aW5nc1BhbmVsLmxvYWRTZXR0aW5ncygpO1xyXG4gICAgICAgIGZvciAoY29uc3Qgc2V0dGluZyBpbiBkZWZhdWx0Q29va2llKSB7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzQ29va2llW3NldHRpbmddID0gZGVmYXVsdENvb2tpZVtzZXR0aW5nXTtcclxuICAgICAgICAgICAgICAgIHNldHRpbmdzUGFuZWwuc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn07XHJcblxyXG5cclxubGV0IGNsYXNzTmFtZUxheWVyXHJcbmxldCBjbGFzc05hbWVTb2NpYWxMaW5rc1xyXG5sZXQgY2xhc3NOYW1lTW9kYWxcclxuXHJcbkNvcmUucHJvdG90eXBlLmluaXRPYnNlcnZlciA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IG1haW5PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMCwgbWxlbiA9IG11dGF0aW9ucy5sZW5ndGg7IGkgPCBtbGVuOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcGx1Z2luTW9kdWxlICE9PSBcInVuZGVmaW5lZFwiKSBwbHVnaW5Nb2R1bGUucmF3T2JzZXJ2ZXIobXV0YXRpb24pO1xyXG5cclxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgd2FzIG5vdGhpbmcgYWRkZWQsIHNraXBcclxuICAgICAgICAgICAgaWYgKCFtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aCB8fCAhKG11dGF0aW9uLmFkZGVkTm9kZXNbMF0gaW5zdGFuY2VvZiBFbGVtZW50KSkgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1swXTtcclxuXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVMYXllciljbGFzc05hbWVMYXllciA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVTb2NpYWxMaW5rcyljbGFzc05hbWVTb2NpYWxMaW5rcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc29jaWFsTGlua3MgJiYgdHlwZW9mIGUuc29jaWFsTGlua3MgPT09IFwic3RyaW5nXCIpWzBdLnNvY2lhbExpbmtzXHJcbiAgICAgICAgICAgIGlmKCFjbGFzc05hbWVNb2RhbCljbGFzc05hbWVNb2RhbCA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUubW9kYWwgJiYgdHlwZW9mIGUubW9kYWwgPT09IFwic3RyaW5nXCIgJiYgZS5pbm5lciAmJiB0eXBlb2YgZS5pbm5lciA9PT0gXCJzdHJpbmdcIiAmJiAhZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUpWzBdLm1vZGFsXHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lTGF5ZXIpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiZ3VpbGQtc2V0dGluZ3MtYmFzZS1zZWN0aW9uXCIpLmxlbmd0aCkgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZVNvY2lhbExpbmtzKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImxheWVyLWlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwidXNlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiYmQtc2V0dGluZ3Mtc2lkZWJhclwiKSkgc2V0dGluZ3NQYW5lbC5yZW5kZXJTaWRlYmFyKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLnBhcmVudEVsZW1lbnQgPT0gZG9jdW1lbnQuYm9keSAmJiBub2RlLnF1ZXJ5U2VsZWN0b3IoXCIjYWNlX3NldHRpbmdzbWVudVwiKSkgbm9kZS5pZCA9IFwiYWNlX3NldHRpbmdzbWVudV9jb250YWluZXJcIjtcclxuXHJcbiAgICAgICAgICAgIC8qXHJcbiAgICAgICAgICAgIGlmKG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZU1vZGFsKSl7XHJcbiAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAgICAgICAgICogQHR5cGUge0VsZW1lbnR9XHJcbiAgICAgICAgICAgICAgICAgICAgICovLypcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBVc2VyUHJvZmlsZSA9IFV0aWxzLmdldE5lc3RlZFByb3Aobm9kZSwgXCJjaGlsZE5vZGVzLjAuY2hpbGROb2Rlcy4wXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVzZXIgPSBCRFYyLmdldEludGVybmFsSW5zdGFuY2Uobm9kZSkucGVuZGluZ1Byb3BzLmNoaWxkcmVuLnByb3BzLmNoaWxkcmVuLnByb3BzLnVzZXJcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh1c2VyKVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoVXNlclByb2ZpbGUgJiYgVXNlclByb2ZpbGUuY2hpbGROb2Rlcy5sZW5ndGggPT09IDIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVyID0gVXNlclByb2ZpbGUuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBCRFYyLmdldEludGVybmFsSW5zdGFuY2UoaGVhZGVyKS5yZXR1cm4ucGVuZGluZ1Byb3BzLmNoaWxkcmVuWzFdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBcIiwge30sIFwic2x0c3ZcIikpICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJBbiBlcnJvciBvY2N1cmVkIGluIEJhZGdlIFJlbmRlcmluZzpcIiwgZSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSovXHJcblxyXG4gICAgICAgICAgICAvLyBFbW9qaSBQaWNrZXJcclxuICAgICAgICAgICAgLy9ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJlbW9qaVBpY2tlci0zbTFTLWpcIikubGVuZ3RoICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuZW1vamlQaWNrZXItM20xUy1qXCIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5pbWF0b3JMZWZ0LTFFUXhVMFwiKVxyXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWFpbk9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5zaG93Q2hhbmdlbG9nTW9kYWwgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hTb2NpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnNvY2lhbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFUYWJCYXIpIHJldHVybjtcclxuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPCAzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKEFuY2hvcikge1xyXG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGU7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld09uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZSA9IG5ld09uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIHNpemVzLFxyXG4gICAgICAgICAgICBjbGFzc05hbWVWZXJzaW9uSGFzaFxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yTXV0ZWQpWzBdLmNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYExpZ2h0Y29yZCAke2VsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCBgKCR7KGVsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS5jb21taXQgfHwgXCJVbmtub3duXCIpLnNsaWNlKDAsIDcpfSlgKSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcclxuICAgICAgICBdXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2lvbnMgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlO1xyXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgIH07XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRHdWlsZENsYXNzZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIndyYXBwZXJcIiwgXCJ1bnJlYWRNZW50aW9uc0JhclwiKTtcclxuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcclxuICAgIGNvbnN0IHBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImJsb2JDb250YWluZXJcIik7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRMaXN0SXRlbXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xyXG4gICAgY29uc3QgbGlzdEl0ZW1DbGFzcyA9IEd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IEd1aWxkQ29tcG9uZW50ID0gcmVhY3RJbnN0YW5jZS5yZXR1cm4udHlwZTtcclxuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEudW5yZWFkKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtdW5yZWFkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuc2VsZWN0ZWQpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1zZWxlY3RlZFwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmF1ZGlvKSByZXR1cm5WYWx1ZS5wcm9wcy5jbGFzc05hbWUgKz0gXCIgYmQtYXVkaW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS52aWRlbykgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXZpZGVvXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYmFkZ2UpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1iYWRnZVwiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLmFuaW1hdGFibGUpIHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC1hbmltYXRhYmxlXCI7XHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkUGlsbHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkUGlsbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xyXG4gICAgaWYgKCFndWlsZFBpbGwpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRQaWxsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChndWlsZFBpbGwsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuc2VsZWN0ZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcclxuICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcclxuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBndWlsZENvbXBvbmVudHMuU2VwYXJhdG9yKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlblszXS50eXBlID0gR3VpbGRTZXBhcmF0b3I7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgQXR0YWNobWVudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF0dGFjaG1lbnRcIilbMF0gLy8gdGVtcG9yYXJ5XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuQXR0YWNobWVudFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goQXR0YWNobWVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBjb25zdCBhdHRhY2htZW50ID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0gfHwgbnVsbFxyXG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuXCIpO1xyXG5cclxuICAgICAgICBpZiAoIWNoaWxkcmVuIHx8ICFhdHRhY2htZW50IHx8ICFhdHRhY2htZW50LnVybClyZXR1cm5cclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IGlkID0gdXVpZHY0KClcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgIGlkOiBcImNlcnRpZmllZC1cIitpZFxyXG4gICAgICAgIH0pKVxyXG4gICAgICAgIFBsdWdpbkNlcnRpZmllci5wYXRjaChhdHRhY2htZW50LCBcImNlcnRpZmllZC1cIitpZClcclxuICAgIH19KVxyXG59XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaE1lc3NhZ2VIZWFkZXIgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgTWVzc2FnZUhlYWRlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiTWVzc2FnZVRpbWVzdGFtcFwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFBbmNob3IgfHwgIU1lc3NhZ2VIZWFkZXIgfHwgIU1lc3NhZ2VIZWFkZXIuZGVmYXVsdCkgcmV0dXJuO1xyXG4gICAgdGhpcy5tZXNzYWdlSGVhZGVyUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZXNzYWdlSGVhZGVyLCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGF1dGhvciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwibWVzc2FnZS5hdXRob3JcIik7XHJcbiAgICAgICAgLy8gY29uc3QgaGVhZGVyID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLnJldHVyblZhbHVlLCBcInByb3BzLmNoaWxkcmVuLjEucHJvcHNcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuXCIpO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWF1dGhvciB8fCAhYXV0aG9yLmlkKXJldHVyblxyXG4gICAgICAgIC8vIGlmIChoZWFkZXIgJiYgaGVhZGVyLmNsYXNzTmFtZSkgaGVhZGVyLmNsYXNzTmFtZSArPSBcIiBcIlxyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHJldHVybjtcclxuICAgICAgICBpZiAoYXV0aG9yLmlkID09PSBcIjI0OTc0NjIzNjAwODE2OTQ3M1wiKSB7IC8vIFJhdWVuemk6IEJhbmRhZ2VkQkQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtY2hhdC1iYWRnZVwiLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGF1dGhvci5pZCA9PT0gXCI2OTY0ODExOTQ0NDMwMTQxNzRcIiB8fCBhdXRob3IuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkxpZ2h0Y29yZCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETzogZml4IDEyNzg3Njg5IGJhZGdlcyBkdXBsaWNhdGVcclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgYXV0aG9yLCB0cnVlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGNoYXQpe1xyXG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiYWRnZXMtXCIraWQpXHJcbiAgICAgICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVyblxyXG5cclxuICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuXHJcbiAgICAgICAgZGlzdGFudC5nZXRCYWRnZXModXNlci5pZClcclxuICAgICAgICAudGhlbihiYWRnZXMgPT4ge1xyXG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzdmc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtbG9nb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJhZGdlLnNjb3Blcy5mb3JFYWNoKHNjb3BlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy51c2VyID0gdXNlclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pIFxyXG4gICAgICAgICAgICAgICAgaWYoIWJhZGdlLmhyZWYpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLkFuY2hvciA9IEFuY2hvclxyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlLmhyZWYgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGJhZGdlLmhyZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2MiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXHJcbiAgICAgICAgICAgICAgICBkaXYyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVtYmVyTGlzdFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZW1iZXJMaXN0SXRlbSA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWVtYmVyTGlzdEl0ZW1cIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZW1iZXJMaXN0SXRlbSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyRGVjb3JhdG9ycykgcmV0dXJuO1xyXG4gICAgdGhpcy5tZW1iZXJMaXN0UGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUsIFwicmVuZGVyRGVjb3JhdG9yc1wiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhdXNlciB8fCAhdXNlci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpe1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGZhbHNlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGluamVjdGlvblBhdGggPSBEYXRhU3RvcmUuaW5qZWN0aW9uUGF0aDtcclxuICAgIGlmICghaW5qZWN0aW9uUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIGNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG4gICAgY29uc3Qgcm1yZiA9IHJlcXVpcmUoXCJyaW1yYWZcIik7XHJcbiAgICBjb25zdCB5YXV6bCA9IHJlcXVpcmUoXCJ5YXV6bFwiKTtcclxuICAgIGNvbnN0IG1rZGlycCA9IHJlcXVpcmUoXCJta2RpcnBcIik7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gLypyZXF1aXJlKFwicmVxdWVzdFwiKTsqLyBudWxsXHJcblxyXG4gICAgY29uc3QgcGFyZW50UGF0aCA9IHBhdGgucmVzb2x2ZShpbmplY3Rpb25QYXRoLCBcIi4uXCIpO1xyXG4gICAgY29uc3QgZm9sZGVyTmFtZSA9IHBhdGguYmFzZW5hbWUoaW5qZWN0aW9uUGF0aCk7XHJcbiAgICBjb25zdCB6aXBMaW5rID0gXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL2FyY2hpdmUvaW5qZWN0b3IuemlwXCI7XHJcbiAgICBjb25zdCBzYXZlZFppcCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcImluamVjdG9yLnppcFwiKTtcclxuICAgIGNvbnN0IGV4dHJhY3RlZEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBcIkJldHRlckRpc2NvcmRBcHAtaW5qZWN0b3JcIik7XHJcblxyXG4gICAgLy8gRG93bmxvYWQgdGhlIGluamVjdG9yIHppcCBmaWxlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBcIkRvd25sb2FkaW5nIFwiICsgemlwTGluayk7XHJcbiAgICBsZXQgc3VjY2VzcyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIHJlcXVlc3QuZ2V0KHt1cmw6IHppcExpbmssIGVuY29kaW5nOiBudWxsfSwgYXN5bmMgKGVycm9yLCByZXNwb25zZSwgYm9keSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3IgfHwgcmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSByZXR1cm4gcmVzb2x2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIC8vIFNhdmUgYSBiYWNrdXAgaW4gY2FzZSBzb21lb25lIGhhcyB0aGVpciBvd24gY29weVxyXG4gICAgICAgICAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhzYXZlZFppcCwgcmVzKSk7XHJcbiAgICAgICAgICAgIGlmIChhbHJlYWR5RXhpc3RzKSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMucmVuYW1lKHNhdmVkWmlwLCBgJHtzYXZlZFppcH0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gLCByZXMpKTtcclxuXHJcbiAgICAgICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiV3JpdGluZyBcIiArIHNhdmVkWmlwKTtcclxuICAgICAgICAgICAgZnMud3JpdGVGaWxlKHNhdmVkWmlwLCBib2R5LCBlcnIgPT4gcmVzb2x2ZSghZXJyKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIGlmICghc3VjY2VzcykgcmV0dXJuIHN1Y2Nlc3M7XHJcblxyXG4gICAgLy8gQ2hlY2sgYW5kIGRlbGV0ZSByZW5hbWUgZXh0cmFjdGlvblxyXG4gICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5leGlzdHMoZXh0cmFjdGVkRm9sZGVyLCByZXMpKTtcclxuICAgIGlmIChhbHJlYWR5RXhpc3RzKSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMucmVuYW1lKGV4dHJhY3RlZEZvbGRlciwgYCR7ZXh0cmFjdGVkRm9sZGVyfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG4gICAgXHJcbiAgICAvLyBVbnppcCB0aGUgZG93bmxvYWRlZCB6aXAgZmlsZVxyXG4gICAgY29uc3QgemlwZmlsZSA9IGF3YWl0IG5ldyBQcm9taXNlKHIgPT4geWF1emwub3BlbihzYXZlZFppcCwge2xhenlFbnRyaWVzOiB0cnVlfSwgKGVyciwgemlwKSA9PiAgcih6aXApKSk7XHJcbiAgICB6aXBmaWxlLm9uKFwiZW50cnlcIiwgZnVuY3Rpb24oZW50cnkpIHtcclxuICAgICAgICAvLyBTa2lwIGRpcmVjdG9yaWVzLCB0aGV5IGFyZSBoYW5kbGVkIHdpdGggbWtkaXJwXHJcbiAgICAgICAgaWYgKGVudHJ5LmZpbGVOYW1lLmVuZHNXaXRoKFwiL1wiKSkgcmV0dXJuIHppcGZpbGUucmVhZEVudHJ5KCk7XHJcblxyXG4gICAgICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRXh0cmFjdGluZyBcIiArIGVudHJ5LmZpbGVOYW1lKTtcclxuICAgICAgICAvLyBNYWtlIGFueSBuZWVkZWQgcGFyZW50IGRpcmVjdG9yaWVzXHJcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIG1rZGlycC5zeW5jKHBhdGguZGlybmFtZShmdWxsUGF0aCkpO1xyXG4gICAgICAgIHppcGZpbGUub3BlblJlYWRTdHJlYW0oZW50cnksIGZ1bmN0aW9uKGVyciwgcmVhZFN0cmVhbSkge1xyXG4gICAgICAgICAgICBpZiAoZXJyKSByZXR1cm4gc3VjY2VzcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICByZWFkU3RyZWFtLm9uKFwiZW5kXCIsIGZ1bmN0aW9uKCkge3ppcGZpbGUucmVhZEVudHJ5KCk7fSk7IC8vIEdvIHRvIG5leHQgZmlsZSBhZnRlciB0aGlzXHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ucGlwZShmcy5jcmVhdGVXcml0ZVN0cmVhbShmdWxsUGF0aCkpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgICB6aXBmaWxlLnJlYWRFbnRyeSgpOyAvLyBTdGFydCByZWFkaW5nXHJcblxyXG4gICAgLy8gV2FpdCBmb3IgdGhlIGZpbmFsIGZpbGUgdG8gZmluaXNoXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHppcGZpbGUub25jZShcImVuZFwiLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nIGR1cmluZyBmaW5hbCBzdGVwXHJcbiAgICBjb25zdCBiYWNrdXBGb2xkZXIgPSBwYXRoLnJlc29sdmUocGFyZW50UGF0aCwgYCR7Zm9sZGVyTmFtZX0uYmFrJHtNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLm5vdygpKX1gKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGluamVjdGlvblBhdGgsIGJhY2t1cEZvbGRlciwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIC8vIFJlbmFtZSB0aGUgZXh0cmFjdGVkIGZvbGRlciB0byB3aGF0IGl0IHNob3VsZCBiZVxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgYFJlbmFtaW5nICR7cGF0aC5iYXNlbmFtZShleHRyYWN0ZWRGb2xkZXIpfSB0byAke2ZvbGRlck5hbWV9YCk7XHJcbiAgICBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBpbmplY3Rpb25QYXRoLCBlcnIgPT4gcmVzb2x2ZSghZXJyKSkpO1xyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJGYWlsZWQgdG8gcmVuYW1lIHRoZSBmaW5hbCBkaXJlY3RvcnlcIik7XHJcbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gSWYgcmVuYW1lIGhhZCBpc3N1ZXMsIGRlbGV0ZSB3aGF0IHdlIHRyaWVkIHRvIHJlbmFtZSBhbmQgcmVzdG9yZSBiYWNrdXBcclxuICAgIGlmICghc3VjY2Vzcykge1xyXG4gICAgICAgIFV0aWxzLmVycihcIkluamVjdG9yVXBkYXRlXCIsIFwiU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4gcmVzdG9yaW5nIGJhY2t1cHMuXCIpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihleHRyYWN0ZWRGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShiYWNrdXBGb2xkZXIsIGluamVjdGlvblBhdGgsIHJlc29sdmUpKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgZXZlcnl0aGluZyBzaG91bGQgaGF2ZSBnb25lIHNtb290aGx5LlxyXG4gICAgLy8gQ2xlYW51cCB0aGUgYmFja3VwIGZvbGRlciB0aGVuIHJlbW92ZSB0aGUgemlwXHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHJtcmYoYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnVubGluayhzYXZlZFppcCwgcmVzb2x2ZSkpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiSW5qZWN0b3IgVXBkYXRlZCFcIik7XHJcbiAgICByZXR1cm4gc3VjY2VzcztcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBDb3JlKCk7IiwiY29uc3QgX19ub25fd2VicGFja19yZXF1aXJlX18gPSB3aW5kb3cucmVxdWlyZVxyXG5cclxuaW1wb3J0IHtiZENvbmZpZ30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuXHJcbmNvbnN0IGZzID0gcmVxdWlyZShcImZzXCIpO1xyXG5jb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbmNvbnN0IHJlbGVhc2VDaGFubmVsID0gRGlzY29yZE5hdGl2ZS5nbG9iYWxzID8gRGlzY29yZE5hdGl2ZS5nbG9iYWxzLnJlbGVhc2VDaGFubmVsIDogRGlzY29yZE5hdGl2ZS5hcHAgPyBEaXNjb3JkTmF0aXZlLmFwcC5nZXRSZWxlYXNlQ2hhbm5lbCgpIDogXCJzdGFibGVcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEYXRhU3RvcmUge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhID0ge3NldHRpbmdzOiB7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX19O1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YSA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuQkRGaWxlKSkgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyh0aGlzLkJERmlsZSwgXCJiaW5hcnlcIikpXHJcbiAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHRoaXMuZGF0YSA9IGRhdGE7XHJcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLnNldHRpbmdzRmlsZSkpIHJldHVybjtcclxuICAgICAgICAgICAgbGV0IHNldHRpbmdzID0gX19ub25fd2VicGFja19yZXF1aXJlX18odGhpcy5zZXR0aW5nc0ZpbGUpO1xyXG4gICAgICAgICAgICBmcy51bmxpbmtTeW5jKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmdzLmhhc093blByb3BlcnR5KFwic2V0dGluZ3NcIikpIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHtbcmVsZWFzZUNoYW5uZWxdOiBzZXR0aW5nc30pO1xyXG4gICAgICAgICAgICBlbHNlIHNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7c3RhYmxlOiB7fSwgY2FuYXJ5OiB7fSwgcHRiOiB7fX0sIHNldHRpbmdzKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRCRERhdGEoXCJzZXR0aW5nc1wiLCBzZXR0aW5ncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICBVdGlscy5hbGVydChcIkNvcnJ1cHQgU3RvcmFnZVwiLCBcIlRoZSBiZCBzdG9yYWdlIGhhcyBzb21laG93IGJlY29tZSBjb3JydXB0LiBZb3UgbWF5IGVpdGhlciB0cnkgdG8gc2FsdmFnZSB0aGUgZmlsZSBvciBkZWxldGUgaXQgdGhlbiByZWxvYWQuXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgaW5qZWN0aW9uUGF0aCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuX2luamVjdGlvblBhdGgpIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoO1xyXG4gICAgICAgIGNvbnN0IGVsZWN0cm9uID0gcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5hcHA7XHJcbiAgICAgICAgY29uc3QgYmFzZSA9IGVsZWN0cm9uLmdldEFwcFBhdGgoKTtcclxuICAgICAgICBjb25zdCByb2FtaW5nQmFzZSA9IGVsZWN0cm9uLmdldFBhdGgoXCJ1c2VyRGF0YVwiKTtcclxuICAgICAgICBjb25zdCByb2FtaW5nTG9jYXRpb24gPSBwYXRoLnJlc29sdmUocm9hbWluZ0Jhc2UsIGVsZWN0cm9uLmdldFZlcnNpb24oKSwgXCJtb2R1bGVzXCIsIFwiZGlzY29yZF9kZXNrdG9wX2NvcmVcIiwgXCJpbmplY3RvclwiKTtcclxuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IHBhdGgucmVzb2x2ZShiYXNlLCBcIi4uXCIsIFwiYXBwXCIpO1xyXG4gICAgICAgIGNvbnN0IHJlYWxMb2NhdGlvbiA9IGZzLmV4aXN0c1N5bmMobG9jYXRpb24pID8gbG9jYXRpb24gOiBmcy5leGlzdHNTeW5jKHJvYW1pbmdMb2NhdGlvbikgPyByb2FtaW5nTG9jYXRpb24gOiBudWxsO1xyXG4gICAgICAgIGlmICghcmVhbExvY2F0aW9uKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aCA9IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSByZWFsTG9jYXRpb247XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbmZpZ0ZpbGUoKSB7cmV0dXJuIHRoaXMuX2NvbmZpZ0ZpbGUgfHwgKHRoaXMuX2NvbmZpZ0ZpbGUgPSBwYXRoLnJlc29sdmUodGhpcy5pbmplY3Rpb25QYXRoLCBcImJldHRlcmRpc2NvcmRcIiwgXCJjb25maWcuanNvblwiKSk7fVxyXG4gICAgZ2V0IEJERmlsZSgpIHtyZXR1cm4gdGhpcy5fQkRGaWxlIHx8ICh0aGlzLl9CREZpbGUgPSBwYXRoLnJlc29sdmUoYmRDb25maWcuZGF0YVBhdGgsIFwiYmRzdG9yYWdlLmpzb25cIikpO31cclxuICAgIGdldCBzZXR0aW5nc0ZpbGUoKSB7cmV0dXJuIHRoaXMuX3NldHRpbmdzRmlsZSB8fCAodGhpcy5fc2V0dGluZ3NGaWxlID0gcGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoLCBcImJkc2V0dGluZ3MuanNvblwiKSk7fVxyXG4gICAgZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSB7cmV0dXJuIHBhdGgucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBwbHVnaW5OYW1lICsgXCIuY29uZmlnLmpzb25cIik7fVxyXG5cclxuICAgIGdldFNldHRpbmdHcm91cChrZXkpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNldHRpbmdzW3JlbGVhc2VDaGFubmVsXVtrZXldIHx8IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2V0dGluZ0dyb3VwKGtleSwgZGF0YSkge1xyXG4gICAgICAgIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSA9IGRhdGE7XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QkREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFba2V5XSB8fCBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJERGF0YShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcImJpbmFyeVwiKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkpKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgdmFsdWUpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xyXG4gICAgICAgIGlmICh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPT09IHVuZGVmaW5lZCkgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0ge307XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZGVsZXRlUGx1Z2luRGF0YShwbHVnaW5OYW1lLCBrZXkpIHtcclxuICAgICAgICBpZiAodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID09PSB1bmRlZmluZWQpIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9IHt9O1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSwgSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdLCBudWxsLCA0KSwgXCJiaW5hcnlcIik7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTGlzdGVuZXIgPSB0aGlzLmRlYnVnTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSB0aGlzLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0Q29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0xpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTE5IHx8IGUud2hpY2ggPT0gMTE4KSB7Ly9GOFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Z2dlcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1kZWJ1Z2dlclxyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3B5U2VsZWN0b3JMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IoZS50YXJnZXQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xheWVyLCBcclxuICAgICAgICAgICAgICAgIGNsYXNzSXRlbXNcclxuICAgICAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5kaXNhYmxlZFBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tZW51KVswXVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhdHRhY2goKSB7XHJcbiAgICAgICAgICAgICAgICBpZighY2xhc3NJdGVtcyB8fCAhY2xhc3NMYXllci5sYXllcilyZXR1cm4gY29uc29sZS5sb2coY2xhc3NJdGVtcywgY2xhc3NMYXllci5sYXllcilcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY20gPSBET00ucXVlcnkoXCIuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5tZW51KSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudCA+IC5cIitVdGlscy5yZW1vdmVEYShjbGFzc0xheWVyLmxheWVyQ29udGFpbmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzTGF5ZXIubGF5ZXJ9XCI+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY20gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5tZW51fSAke2NsYXNzSXRlbXMuc3R5bGVGbGV4aWJsZX0gJHtjbGFzc0l0ZW1zLmFjY29tbW9kYXRlU2Nyb2xsYmFyfSBiZC1jb250ZXh0LW1lbnVcIiBzdHlsZT1cIlwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5hcHBlbmQoY20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY21XcmFwKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWVudVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmlkID0gXCJiZC1jb3B5LXNlbGVjdG9yLWNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ29weSBTZWxlY3RvciBBY3Rpb25zXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ2xhc3NlcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc2Nyb2xsZXJXcmFwKVswXVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtzY3JvbGxlckNsYXNzZXMuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlckNsYXNzZXMudGhlbWVHaG9zdEhhaXJsaW5lfVwiPjwvZGl2PmApXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIpWzBdLnNjcm9sbGVyfSAke2NsYXNzSXRlbXMuc2Nyb2xsZXJ9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlcldyYXAuYXBwZW5kKHNjcm9sbGVyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtLmFwcGVuZChzY3JvbGxlcldyYXApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUNNID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSAhPT0gMjcpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY21XcmFwLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBjbS5wYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gY20uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWcgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwiZ3JvdXBcIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWkgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5pdGVtfSAke2NsYXNzSXRlbXMubGFiZWxDb250YWluZXJ9ICR7Y2xhc3NJdGVtcy5jb2xvckRlZmF1bHR9XCIgcm9sZT1cIm1lbnVpdGVtXCIgaWQ9XCJiZC1jb3B5LXNlbGVjdG9yLWl0ZW0tY21cIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubGFiZWx9XCI+Q29weSBTZWxlY3RvcjwvZGl2PmApKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuTmF0aXZlTW9kdWxlLmNvcHkoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBET00ucXVlcnlBbGwoXCJkaXZbcm9sZT1tZW51aXRlbV0uXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAmJiBlbGVtZW50cy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5hZGQoY2xhc3NJdGVtcy5mb2N1c2VkKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xyXG4gICAgICAgICAgICAgICAgaWYoc2Nyb2xsZXIuY2hpbGROb2Rlcy5sZW5ndGgpeyAvLyBhcGVuZCBhIHNlcGFyYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5zZXBhcmF0b3J9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoc2VwYXJhdG9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKGNtZyk7XHJcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZyBcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSAoY21XcmFwLnN0eWxlLnRvcCAtIGNtZy5jbGllbnRIZWlnaHQpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgc2V0VGltZW91dChhdHRhY2gsIDEpO1xyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RvcihlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHJldHVybiBgIyR7ZWxlbWVudC5pZH1gO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGxQYXRoKGVsKXtcclxuICAgICAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcclxuICAgICAgICAgICAgICBpZiAoZWwuaWQpe1xyXG4gICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdCgnIycrZWwuaWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWw9PWVsLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKStBcnJheS5mcm9tKGVsLmNsYXNzTGlzdC5lbnRyaWVzKCkpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0xLGU9ZWw7ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2U9ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLGMrKyk7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpKyhlbC5jbGFzc05hbWUgfHwgXCJcIikuc3BsaXQoXCIgXCIpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikrXCI6bnRoLWNoaWxkKFwiK2MrXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWw9ZWwucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzLmpvaW4oXCIgPiBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxyXG4gICAgICAgIC8qXHJcbiAgICAgICAgY29uc3QgcnVsZXMgPSB0aGlzLmdldFJ1bGVzKGVsZW1lbnQpO1xyXG4gICAgICAgIGNvbnN0IGxhdGVzdFJ1bGUgPSBydWxlc1tydWxlcy5sZW5ndGggLSAxXTtcclxuICAgICAgICBpZiAobGF0ZXN0UnVsZSkgcmV0dXJuIGxhdGVzdFJ1bGUuc2VsZWN0b3JUZXh0O1xyXG4gICAgICAgIGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCkgcmV0dXJuIGAuJHtBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KS5qb2luKFwiLlwiKX1gO1xyXG4gICAgICAgIHJldHVybiBgLiR7QXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0KS5qb2luKFwiLlwiKX1gOyovXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UnVsZXMoZWxlbWVudCwgY3NzID0gZWxlbWVudC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzKSB7XHJcbiAgICAgICAgLy9pZiAod2luZG93LmdldE1hdGNoZWRDU1NSdWxlcykgcmV0dXJuIHdpbmRvdy5nZXRNYXRjaGVkQ1NTUnVsZXMoZWxlbWVudCk7XHJcbiAgICAgICAgY29uc3Qgc2hlZXRzID0gWy4uLmNzc10uZmlsdGVyKHMgPT4gIXMuaHJlZiB8fCAhcy5ocmVmLmluY2x1ZGVzKFwiQmV0dGVyRGlzY29yZEFwcFwiKSk7XHJcbiAgICAgICAgY29uc3QgcnVsZXMgPSBzaGVldHMubWFwKHMgPT4gWy4uLihzLmNzc1J1bGVzIHx8IFtdKV0pLmZsYXQoKTtcclxuICAgICAgICBjb25zdCBlbGVtZW50UnVsZXMgPSBydWxlcy5maWx0ZXIociA9PiByICYmIHIuc2VsZWN0b3JUZXh0ICYmIGVsZW1lbnQubWF0Y2hlcyhyLnNlbGVjdG9yVGV4dCkgJiYgci5zdHlsZS5sZW5ndGggJiYgci5zZWxlY3RvclRleHQuc3BsaXQoXCIsIFwiKS5sZW5ndGggPCA4ICYmICFyLnNlbGVjdG9yVGV4dC5zcGxpdChcIiwgXCIpLmluY2x1ZGVzKFwiKlwiKSk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRSdWxlcztcclxuICAgIH1cclxufTsiLCJleHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzYWJsZVR5cGluZyB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5zdGFydFR5cGluZylcclxuICAgICAgICAudGhlbih0eXBpbmdNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXNcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnRUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZ1xyXG4gICAgICAgICAgICB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdGFydFR5cGluZyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgICAgICBpZihzZWxmLmRpc2FibGVkKXJldHVybiBzdGFydFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdG9wVHlwaW5nID0gdHlwaW5nTW9kdWxlLmRlZmF1bHQuc3RvcFR5cGluZ1xyXG4gICAgICAgICAgICB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0b3BUeXBpbmcuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJ1Z0h1bnRlckJhZGdlIGZyb20gXCIuLi9zdmcvYnVnX2h1bnRlclwiXHJcbmltcG9ydCBMaWdodGNvcmRVc2VyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9MaWdodGNvcmRVc2VyXCI7XHJcbmltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5pbXBvcnQgeyBzZXR0aW5nc0Nvb2tpZSB9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHV1aWR2NCgpIHsgLy8gR2VuZXJhdGUgVVVJRCAoTm8gY3J5cHRvIHJuZylcclxuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uKGMpIHtcclxuICAgICAgICB2YXIgciA9IE1hdGgucmFuZG9tKCkgKiAxNiB8IDAsIHYgPSBjID09ICd4JyA/IHIgOiAociAmIDB4MyB8IDB4OCk7XHJcbiAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xyXG4gICAgfSk7XHJcbn0gIFxyXG5cclxuY29uc3QgYXdhaXRpbmdCYWRnZXNQcm9taXNlcyA9IHt9XHJcbmxldCBiYWRnZXNUb0ZldGNoID0gW11cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXN0YW50U2VydmVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5fY2FjaGUgPSB7XHJcbiAgICAgICAgICAgIGJhZGdlczoge1xyXG5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgY2FjaGUoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVcclxuICAgIH1cclxuXHJcbiAgICBzZXQgY2FjaGUoZGF0YSl7XHJcbiAgICAgICAgaWYodHlwZW9mIGRhdGEgIT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIHRoaXMuX2NhY2hlICE9PSBcIm9iamVjdFwiKXJldHVybiB0aGlzLl9jYWNoZSA9IGRhdGFcclxuICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGUgPSBPYmplY3QuYXNzaWduKHRoaXMuX2NhY2hlLCBkYXRhKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZSgpe1xyXG4gICAgICAgIEJkQXBpLnNob3dUb2FzdChcIkRlbGV0aW5nIGFsbCBpbmZvcyBhYm91dCB5b3Ugb24gTGlnaHRjb3JkIFNlcnZlcnMuLi5cIiwge3R5cGU6IFwid2FyblwifSlcclxuICAgICAgICByZXR1cm4gaGFuZGxlUmVxdWVzdChSb3V0ZXMuZGVsZXRlLCBcImRlbGV0ZVwiKVxyXG4gICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZGVsZXRlIGFsbCBpbmZvcm1hdGlvbnM6ICR7KHJlcy5zdGF0dXMrXCIgXCIrcmVzLnN0YXR1c1RleHQrXCIgXCIrYXdhaXQgcmVzLnRleHQoKSl9YClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zLmApXHJcbiAgICAgICAgICAgIEJkQXBpLnNob3dUb2FzdChcIlN1Y2Nlc2Z1bGx5IGRlbGV0ZWQgaW5mb3JtYXRpb25zXCIsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pXHJcbiAgICAgICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQXBpLkF1dGhvcml6YXRpb24gPSBudWxsXHJcbiAgICAgICAgICAgIHJldHVybiByZXMuanNvbigpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLCBjb3VsZG4ndCBkZWxldGUgaW5mb3JtYXRpb25zLiBTZWUgY29uc29sZSBmb3IgbW9yZSBpbmZvc1wiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZG4ndCBkZWxldGUgYWxsIGluZm9ybWF0aW9uczogJHtlcnIuc3RhY2t9YClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0IGN1c3RvbSBiYWRnZXMgZnJvbSB0aGUgdXNlciBJRC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1c2VyIFRoZSB1c2VyIElEIFxyXG4gICAgICogQHJldHVybnMge1Byb21pc2U8Q29uc3RhbnRzW1wiYmFkZ2VzXCJdPn1cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZ2V0QmFkZ2VzKHVzZXIpe1xyXG4gICAgICAgIGlmKHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdKXJldHVybiB0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXVxyXG4gICAgICAgIGlmKGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0pcmV0dXJuIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cclxuXHJcbiAgICAgICAgbGV0IHJlc29sdmVcclxuICAgICAgICBjb25zdCBuZXdQcm9taXNlID0gbmV3IFByb21pc2UoKHJlcykgPT4gKHJlc29sdmUgPSByZXMpKVxyXG4gICAgICAgIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl0gPSBuZXdQcm9taXNlXHJcblxyXG4gICAgICAgIGNvbnN0IGJhZGdlcyA9IFtdXHJcbiAgICAgICAgZm9yKGxldCBiYWRnZSBvZiBDb25zdGFudHMuYmFkZ2VzKXtcclxuICAgICAgICAgICAgaWYoYmFkZ2UuZGVmYXVsdFVzZXJzLmluY2x1ZGVzKHVzZXIpKWJhZGdlcy5wdXNoKGJhZGdlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBmZXRjaGVkQmFkZ2VzID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgICAgICAgYmFkZ2VzVG9GZXRjaC5wdXNoKFt1c2VyLCByZXNvbHZlXSlcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSBiYWRnZXNUb0ZldGNoXHJcbiAgICAgICAgICAgICAgICBpZih1c2Vycy5sZW5ndGggPT09IDApcmV0dXJuXHJcbiAgICAgICAgICAgICAgICBiYWRnZXNUb0ZldGNoID0gW11cclxuICAgICAgICAgICAgICAgIGhhbmRsZVJlcXVlc3QoUm91dGVzLmJhZGdlcywgXCJQT1NUXCIsIEpTT04uc3RyaW5naWZ5KHVzZXJzLm1hcChlID0+IGVbMF0pKSlcclxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IHNlcnZlciBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2Vycy5mb3JFYWNoKGRhdGEgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VCb2R5ID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlQm9keSlcclxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHVzZXIgb2YgcmVzcG9uc2VCb2R5KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1c2Vycy5maW5kKHByb21pc2UgPT4gcHJvbWlzZVswXSA9PT0gdXNlci51c2VyX2lkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlWzFdKHVzZXIuYmFkZ2VzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHsvLyBDb3VsZG4ndCBmZXRjaCBiYWRnZXM6IGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIShlcnIgaW5zdGFuY2VvZiBMaWdodGNvcmRFcnJvcikpY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcnMuZm9yRWFjaChkYXRhID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsxXShbXSkvLyByZXNvbHZlIG5vIGJhZGdlIGZldGNoZWRcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSwgMClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgZmV0Y2hlZEJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKCFDb25zdGFudHMuYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gV2UgZG8gbm90IGhhdmUgdGhlIENvbXBvbmVudCwgc2tpcCBpdC5cclxuICAgICAgICAgICAgaWYoYmFkZ2VzLmZpbmQoZSA9PiBlLmlkID09PSBiYWRnZSkpY29udGludWUgLy8gQWxyZWFkeSBpbnNlcnRlZC5cclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goQ29uc3RhbnRzLmJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmNhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IE9iamVjdC5hc3NpZ24odGhpcy5jYWNoZS5iYWRnZXMsIHtbdXNlcl06IGJhZGdlc30pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICB9LCA2MDAwMDApO1xyXG5cclxuICAgICAgICByZXNvbHZlKGJhZGdlcylcclxuICAgICAgICBkZWxldGUgYXdhaXRpbmdCYWRnZXNQcm9taXNlc1t1c2VyXVxyXG4gICAgICAgIHJldHVybiBiYWRnZXNcclxuICAgIH1cclxufVxyXG5cclxuY29uc3QgaGFuZGxlUmVxdWVzdCA9IGZ1bmN0aW9uKHJvdXRlLCBtZXRob2QsIGRhdGEpe1xyXG4gICAgaWYoIXNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTVcIl0pe1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgQ2FuY2VsaW5nIHJlcXVlc3Qgb24gJHtyb3V0ZX0gd2l0aCBtZXRob2QgJHttZXRob2R9IGFuZCBib2R5YCwgZGF0YSwgXCJiZWNhdXNlIG9mIHNldHRpbmdzLlwiKVxyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgTGlnaHRjb3JkRXJyb3IoXCJUaGUgY3VycmVudCBzZXR0aW5ncyBibG9ja2VkIHRoZSByZXF1ZXN0LlwiKSlcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKGBTZW5kaW5nIHJlcXVlc3Qgb24gJHtyb3V0ZX0gd2l0aCBtZXRob2QgJHttZXRob2R9IGFuZCBib2R5YCwgZGF0YSlcclxuICAgIHJldHVybiBub2RlRmV0Y2goYCR7Q29uc3RhbnRzLlNFUlZFUl9VUkx9L2FwaS92MSR7cm91dGV9YCwge1xyXG4gICAgICAgIG1ldGhvZCxcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiQ0xJRU5UXCI6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICAgICAgICAgIFwiQXV0aG9yaXphdGlvblwiOiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5BdXRob3JpemF0aW9uIHx8IFwiTm9uZTo6QW5vbnltb3VzXCJcclxuICAgICAgICB9LFxyXG4gICAgICAgIC4uLihkYXRhID8ge1xyXG4gICAgICAgICAgICBib2R5OiBkYXRhXHJcbiAgICAgICAgfSA6IHt9KVxyXG4gICAgfSlcclxufVxyXG5cclxuY2xhc3MgTGlnaHRjb3JkRXJyb3IgZXh0ZW5kcyBFcnJvciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cylcclxuICAgICAgICB0aGlzLm5hbWUgPSBcIkxpZ2h0Y29yZEVycm9yXCJcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IENvbnN0YW50cyA9IHtcclxuICAgIFNFUlZFUl9VUkw6IFwiaHR0cDovLzEyNy4wLjAuMVwiLFxyXG4gICAgYmFkZ2VzOiBbIC8vIFRPRE86IFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmQgVXNlclwiLFxyXG4gICAgICAgICAgICBpZDogXCIwMWNmYTdiMC03Y2RiLTRiMGUtODI1OC05YzZhNzgyMzVjOTNcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXHJcbiAgICAgICAgICAgICAgICBcInVzZXJcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IExpZ2h0Y29yZFVzZXJCYWRnZVxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgbmFtZTogXCJMaWdodGNvcmQgQnVnIEh1bnRlclwiLFxyXG4gICAgICAgICAgICBpZDogXCJmMDQ2OThmNS04MTZiLTQxZTMtYmQwMS05MjI5MTE5M2Q3YTVcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiLFxyXG4gICAgICAgICAgICAgICAgXCI2OTYwMDM0NTY2MTEzODUzOTZcIlxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBzY29wZXM6IFtdLFxyXG4gICAgICAgICAgICBjb21wb25lbnQ6IEJ1Z0h1bnRlckJhZGdlLFxyXG4gICAgICAgICAgICBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9saWdodGNvcmQvbGlnaHRjb3JkL3dpa2kvYmFkZ2VzL2J1Z19odW50ZXJcIlxyXG4gICAgICAgIH1cclxuICAgIF1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IFJvdXRlcyA9IHtcclxuICAgIGJhZGdlczogYC91c2Vycy9iYWRnZXNgLFxyXG4gICAgZGVsZXRlOiBgL2RlbGV0ZWBcclxufSIsIi8qKlxyXG4gKiBDb3B5cmlnaHQgMjAxOCBaYWNoYXJ5IFJhdWVuXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xyXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcclxuICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcclxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZFxyXG4gKiB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsXHJcbiAqIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBXHJcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcclxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GXHJcbiAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRVxyXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cclxuICogXHJcbiAqIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JEUGx1Z2luTGlicmFyeVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlXHJcbiAqIEBuYW1lIE9mZnNldFxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVG9wIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBMZWZ0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBPdXRlciB3aWR0aCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqL1xyXG5cclxuIC8qKlxyXG4gKiBGdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyBhZGRlZCBsaXN0ZW5lci5cclxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxyXG4gKi9cclxuIFxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQWRkcyBhIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBhcyB0aGUgZWxlbWVudCBpZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTdHlsZShpZCwgY3NzKSB7XHJcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTdHlsZShpZCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcy9yZXF1aXJlcyBhIHJlbW90ZSBzY3JpcHQgdG8gYmUgbG9hZGVkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgZm9yIHRoaXMgc2NyaXB0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2NyaXB0IGlzIGxvYWRlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG5cdFx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcclxuXHRcdFx0c2NyaXB0LnNyYyA9IHVybDtcclxuXHRcdFx0c2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcclxuXHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoc2NyaXB0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xyXG4gICAgICAgIGlkID0gdGhpcy5lc2NhcGVJRChpZCk7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxyXG4gICAgc3RhdGljIGFuaW1hdGUoe3RpbWluZyA9IF8gPT4gXywgdXBkYXRlLCBkdXJhdGlvbn0pIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICBcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0ZSh0aW1lKSB7XHJcbiAgICAgICAgICAvLyB0aW1lRnJhY3Rpb24gZ29lcyBmcm9tIDAgdG8gMVxyXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uID4gMSkgdGltZUZyYWN0aW9uID0gMTtcclxuICAgICAgXHJcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXHJcbiAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWluZyh0aW1lRnJhY3Rpb24pO1xyXG4gICAgICBcclxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcclxuICAgICAgXHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uIDwgMSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIG15IHNoaXQgdmVyc2lvbiBvZiBub3QgaGF2aW5nIHRvIHVzZSBgJGAgZnJvbSBqUXVlcnkuIE1lYW5pbmdcclxuICAgICAqIHRoYXQgeW91IGNhbiBwYXNzIGEgc2VsZWN0b3IgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4ge0BsaW5rIG1vZHVsZTpET01Ub29scy5xdWVyeX0uXHJcbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5xdWVyeVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBFaXRoZXIgdGhlIHJlc3VsdCBvZiBgcGFyc2VIVE1MYCBvciBgcXVlcnlgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGFyc2VIVE1MKHNlbGVjdG9yKTtcclxuICAgICAgICBjb25zdCBpc0hUTUwgPSBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgPyBBcnJheS5mcm9tKGVsZW1lbnQpLnNvbWUobiA9PiBuLm5vZGVUeXBlID09PSAxKSA6IGVsZW1lbnQubm9kZVR5cGUgPT09IDE7XHJcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnkoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIEFycmF5IG9mIGFsbCBmb3VuZCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnlBbGwoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcclxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxyXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIGlmIHlvdSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50cyBhdCB0aGUgdG9wIGxldmVsLCB0aGV5IGNhbiB0aGVuIGJlIGFwcGVuZGVkIGFsbCBhdCBvbmNlIHRvIGFub3RoZXIgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxyXG4gICAgICogbm9kZXMgYW5kIHRoZXJlIHdlcmUgbXVsdGlwbGUgdG9wIGxldmVsIG5vZGVzLCBvdGhlcndpc2UgdGhlIHNpbmdsZSBub2RlIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gVGhlIHJlc3VsdCBvZiBIVE1MIHBhcnNpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XHJcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGZyYWdtZW50KSByZXR1cm4gbm9kZTtcclxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFsdGVybmF0ZSBuYW1lIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTH0gKi9cclxuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtyZXR1cm4gdGhpcy5wYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQpO31cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHN0cmluZyBvZiBodG1sIGFuZCBlc2NhcGVzIGl0IHVzaW5nIHRoZSBicm93ZXIncyBvd24gZXNjYXBpbmcgbWVjaGFuaXNtLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwgLSBodG1sIHRvIGJlIGVzY2FwZWRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGVzY2FwZUhUTUwoaHRtbCkge1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XHJcbiAgICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICBzcGFuRWxlbWVudC5hcHBlbmQodGV4dE5vZGUpO1xyXG4gICAgICAgIHRleHROb2RlLm5vZGVWYWx1ZSA9IGh0bWw7XHJcbiAgICAgICAgcmV0dXJuIHNwYW5FbGVtZW50LmlubmVySFRNTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byByZW1vdmVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlbW92ZUNsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQ6IFRvZ2dsZSBjbGFzcyB2YWx1ZTtcclxuICAgICAqIGkuZS4sIGlmIGNsYXNzIGV4aXN0cyB0aGVuIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGZhbHNlLCBpZiBub3QsIHRoZW4gYWRkIGl0IGFuZCByZXR1cm4gdHJ1ZS5cclxuICAgICAqIFdoZW4gYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudDpcclxuICAgICAqIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgY2xhc3MgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byB0b2dnbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZGljYXRvcl0gLSBPcHRpb25hbCBpbmRpY2F0b3IgZm9yIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgdG9nZ2xlZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lLCBpbmRpY2F0b3IpIHtcclxuICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZihpbmRpY2F0b3IpICE9PSBcInVuZGVmaW5lZFwiKSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjLCBpbmRpY2F0b3IpKTtcclxuICAgICAgICBlbHNlIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYykuZXZlcnkoYyA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbmUgY2xhc3Mgd2l0aCBhbm90aGVyXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZE5hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHJlcGxhY2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lIC0gTmV3IG5hbWUgZm9yIHRoZSBjbGFzc1xyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVwbGFjZUNsYXNzKGVsZW1lbnQsIG9sZE5hbWUsIG5ld05hbWUpIHtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZXBsYWNlKG9sZE5hbWUsIG5ld05hbWUpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIGFwcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgYXBwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhcHBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLmFwcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBwcmVwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBwcmVwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmVwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5wcmVwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5pbnNlcnRBZnRlcihvdGhlckVsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5zZXJ0QWZ0ZXIodGhpc05vZGUsIHRhcmdldE5vZGUpIHtcclxuICAgICAgICB0YXJnZXROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXNOb2RlLCB0YXJnZXROb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5hZnRlcihuZXdFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFmdGVyKHRoaXNOb2RlLCBuZXdOb2RlKSB7XHJcbiAgICAgICAgdGhpc05vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgdGhpc05vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5leHQgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgbmV4dCBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiKyBcIiArIHNlbGVjdG9yKSA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc3Vic2VxdWVudCBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG5leHQgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dEFsbChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIn4gKlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN1YnNlcXVlbnQgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dFVudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0LnB1c2goZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSByZXR1cm4gcHJldmlvdXMgJiYgcHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikgPyBwcmV2aW91cyA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgcHJlY2VlZGluZyBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgd2hpY2ggaW5kZXggaW4gY2hpbGRyZW4gYSBjZXJ0YWluIG5vZGUgaXMuIFNpbWlsYXIgdG8galF1ZXJ5J3MgYCQuaW5kZXgoKWBcclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB0byBmaW5kIGl0cyBpbmRleCBpbiBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBub2RlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbmRleEluUGFyZW50KG5vZGUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGxldCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMuaW5kZXhJblBhcmVudH0gKi9cclxuICAgIHN0YXRpYyBpbmRleChub2RlKSB7cmV0dXJuIHRoaXMuaW5kZXhJblBhcmVudChub2RlKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgaWYgaXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcGFyZW50IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIHNpYmxpbmcgZWxlbWVudCBvciBudWxsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuICFzZWxlY3RvciB8fCBlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikgPyBlbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBhbmNlc3RvcnMgb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBwYXJlbnRzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHBhcmVudHMgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSk7XHJcbiAgICAgICAgZWxzZSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcnMgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBhbmNlc3RvcnMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzaWJsaW5ncyBvZiB0aGUgZWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIipcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgc2libGluZ3MgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2libGluZ3MoZWxlbWVudCwgc2VsZWN0b3IgPSBcIipcIikge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGUgPT4gZSAhPSBlbGVtZW50ICYmIGUubWF0Y2hlcyhzZWxlY3RvcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIGNzcyBzdHlsZXMgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBzdHlsZSBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3R5bGUuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBBdHRyaWJ1dGUgdG8gZ2V0IG9yIHNldFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBWYWx1ZSB0byBzZXQgZm9yIGF0dHJpYnV0ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNzcyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIHdpZHRoIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgd2lkdGggYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHdpZHRoLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFdpZHRoIHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpZHRoKGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkud2lkdGgpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgaGVpZ2h0IGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgaGVpZ2h0IGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBoZWlnaHQuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSGVpZ2h0IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhlaWdodChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGlubmVyIHRleHQgb2YgYW4gZWxlbWVudCBpZiBnaXZlbiBhIHZhbHVlLCBvdGhlcndpc2UgcmV0dXJucyBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSB0ZXh0IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gQ29udGVudCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRWl0aGVyIHRoZSBzdHJpbmcgc2V0IGJ5IHRoaXMgY2FsbCBvciB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0ZXh0KGVsZW1lbnQsIHRleHQpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRleHQpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50O1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYWdlLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgb2Zmc2V0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtPZmZzZXR9IC0gVGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2Zmc2V0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxpc3RlbmVycygpIHsgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9uYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgb25jZS5cclxuICAgICAqIGBjb25zdCBjYW5jZWwgPSBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImZpcmVkIVwiKTsgY2FuY2VsKCk7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb25hbGl0eSBmb3IgdGhpcyBtZXRob2QgbWF0Y2hlcyB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9ufSBidXQgYXV0b21hdGljYWxseSBjYW5jZWxzIGl0c2VsZlxyXG4gICAgICogYW5kIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHVwb24gdGhlIGZpcnN0IGZpcmluZyBvZiB0aGUgZGVzaXJlZCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25jZShlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfSA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBfX29mZkFsbChldmVudCwgZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGxldCBtYXRjaEZpbHRlciA9IGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09IHR5cGUsIGRlZmF1bHRGaWx0ZXIgPSBfID0+IF87XHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIG1hdGNoRmlsdGVyID0gbCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQsIGRlZmF1bHRGaWx0ZXIgPSBsID0+IGwuZWxlbWVudCA9PSBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gfHwgW107XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPyBsaXN0ZW5lcnMuZmlsdGVyKG1hdGNoRmlsdGVyKSA6IGxpc3RlbmVycy5maWx0ZXIoZGVmYXVsdEZpbHRlcik7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBsaXN0Lmxlbmd0aDsgYysrKSBsaXN0W2NdLmNhbmNlbCgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb2ZmYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlZCB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiY2xpY2subXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhFbGVtZW50fHN0cmluZyl9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbW92ZSBsaXN0ZW5lciBmcm9tXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50XSAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IFtkZWxlZ2F0ZV0gLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgb3JpZ2luYWwgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihlbGVtZW50KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5fX29mZkFsbChlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSByZXR1cm4gdGhpcy5fX29mZkFsbChldmVudCwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciB3aGVuIHRoZSBub2RlIGlzIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keS5cclxuICAgICAqIFRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgdXBvbiBmaXJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gbm9kZSB0byB3YWl0IGZvclxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZXZlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb25Nb3VudCAtIGRldGVybWluZXMgaWYgaXQgc2hvdWxkIGZpcmUgb24gTW91bnQgb3Igb24gVW5tb3VudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgb25Nb3VudCA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjaywgbXV0YXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20ob25Nb3VudCA/IG11dGF0aW9uLmFkZGVkTm9kZXMgOiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2g7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgdHJ1ZWAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgZmFsc2VgICovXHJcbiAgICBzdGF0aWMgb25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uQWRkZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudChub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Vbm1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vblVubW91bnQobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbWJpbmVzIG11bHRpcGxlIGVsZW1lbnRzIGludG8gb25lIHBhcmVudCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBhcnJheSBvZiBlbGVtZW50cyB0byBwdXQgaW50byBhIHNpbmdsZSBwYXJlbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdyYXAoZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBkb21XcmFwcGVyID0gdGhpcy5wYXJzZUhUTUwoYDxkaXYgY2xhc3M9XCJkb20td3JhcHBlclwiPjwvZGl2PmApO1xyXG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIGRvbVdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudHNbZV0pO1xyXG4gICAgICAgIHJldHVybiBkb21XcmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzb2x2ZXMgdGhlIG5vZGUgdG8gYW4gSFRNTEVsZW1lbnQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgbGlicmFyeSBtb2R1bGVzLlxyXG4gICAgICogQHBhcmFtIHsoalF1ZXJ5fEVsZW1lbnQpfSBub2RlIC0gbm9kZSB0byByZXNvbHZlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXNvbHZlRWxlbWVudChub2RlKSB7XHJcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgIH1cclxufVxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRPTSA9IERPTVRvb2xzIiwiaW1wb3J0IHtiZENvbmZpZywgc2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuLy9pbXBvcnQgRGlzY29yZENyeXB0IGZyb20gXCIuL0Rpc2NvcmRDcnlwdFwiO1xyXG5cclxuY29uc3QgQ29uc3RhbnRzID0ge1xyXG4gICAgRW1vamlSZWdleDogLzxhP1xcLihcXHcrKVxcLihcXGQrKT4vZ1xyXG59XHJcblxyXG5sZXQgQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxubGV0IEVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG5sZXQgQXV0b2NvbXBsZXRlTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpWzBdXHJcbmxldCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpWzBdXHJcbmxldCBFbW9qaU1vZHVsZVF1ZXJ5ID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpWzBdXHJcbmxldCBNZXNzYWdlcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylbMF1cclxubGV0IGd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpWzBdXHJcbmxldCBlbW9qaVNlYXJjaCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRW1vamlNb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmluaXQoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKXtcclxuICAgICAgICAvKiogRW1vamkgQXV0b0NvbXBsZXRlICovXHJcbiAgICAgICAgaWYoIUF1dG9jb21wbGV0ZU1vZHVsZSlBdXRvY29tcGxldGVNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiQXV0b2NvbXBsZXRlXCIpXHJcbiAgICAgICAgaWYoIUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzKUF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMpXHJcbiAgICAgICAgaWYoIUVtb2ppTW9kdWxlUXVlcnkpRW1vamlNb2R1bGVRdWVyeSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylcclxuICAgICAgICBpZighTWVzc2FnZXMpTWVzc2FnZXMgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVxyXG4gICAgICAgIGlmKCFndWlsZE1vZHVsZSlndWlsZE1vZHVsZSA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylcclxuICAgICAgICBpZighZW1vamlTZWFyY2gpZW1vamlTZWFyY2ggPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuICAgICAgICBpZihBdXRvY29tcGxldGVNb2R1bGUgJiYgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMgJiYgRW1vamlNb2R1bGVRdWVyeSAmJiBNZXNzYWdlcyAmJiBndWlsZE1vZHVsZSAmJiBlbW9qaVNlYXJjaCl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBQYXRjaGluZyBnZXRBdXRvY29tcGxldGVPcHRpb25zIG9mIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzYCwgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMpXHJcbiAgICAgICAgICAgIGNvbnN0IGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBBdXRvQ29tcGxldGlvblRlbXBsYXRlcy5nZXRBdXRvY29tcGxldGVPcHRpb25zXHJcbiAgICAgICAgICAgIEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnMgPSBmdW5jdGlvbihlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgICAgIHZhbHVlLkxJR0hUQ09SRF9FTU9KSVMgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyhhcmcxLCBhcmcyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbiA9IGFyZzIubGVuZ3RoID4gMSAmJiBcIi5cIiA9PT0gYXJnMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFbW9qaVVzYWJsZShjb25kaXRpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHF1ZXJ5UmVzdWx0cyh0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBFbW9qaU1vZHVsZVF1ZXJ5LmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHModCwgZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlclJlc3VsdHMoZSwgdCwgbiwgciwgYSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEKGUsIHQsIGEuZW1vamlzLCBuLCByLCBNZXNzYWdlcy5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HLCBNZXNzYWdlcy5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJLCBBdXRvY29tcGxldGVNb2R1bGUuZGVmYXVsdC5FbW9qaSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IGUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBlLmlkIHx8IGUudW5pcXVlTmFtZSB8fCBlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VudGluZWw6IFwiLlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd1aWxkOiBudWxsICE9IGUuZ3VpbGRJZCA/IGd1aWxkTW9kdWxlLmRlZmF1bHQuZ2V0R3VpbGQoZS5ndWlsZElkKSA6IG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSksIChmdW5jdGlvbihlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBlICsgXCIuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRQbGFpblRleHQoaWQsIGd1aWxkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppcyA9IGd1aWxkLmVtb2ppcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gZW1vamlzIHx8IG51bGwgPT0gZW1vamlzW2lkXSkgcmV0dXJuIFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaSA9IGVtb2ppc1tpZF0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0FuaW1hdGVkID0gZW1vamkuYW5pbWF0ZWQgPyBcImFcIiA6IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbW9qaS5tYW5hZ2VkIHx8IG51bGwgPT0gZW1vamkuaWQgPyBcIi5cIiArIGVtb2ppLm5hbWUgKyBcIi5cIiA6IFwiPFwiICsgaXNBbmltYXRlZCArIFwiLlwiICsgKGVtb2ppLm9yaWdpbmFsTmFtZSB8fCBlbW9qaS5uYW1lKSArIFwiLlwiICsgZW1vamkuaWQgKyBcIj5cIlxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0UmF3VGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihuZXcgRXJyb3IoXCJDb3VsZG4ndCBzdGFydCBhdXRvY29tcGxldGlvbiBvZiBMaWdodGNvcmQncyBlbW9qaXMuXCIpKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyoqIEVtb2ppIGRpc3BsYXkgKi9cclxuICAgICAgICB3aGlsZSAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMCkpO1xyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW9qaVJlbmRlcil7XHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlXCIpXHJcbiAgICAgICAgICAgICAgICBpZighbWVzc2FnZSlyZXR1cm5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIWNvbnRlbnQgfHwgIWNvbnRlbnQubGVuZ3RoKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvLyBjb250ZW50ID0gRGlzY29yZENyeXB0LmRlY3J5cHRDb250ZW50KGNvbnRlbnQpXHJcbiAgICBcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge3tcclxuICAgICAgICAgICAgICAgICAqICByYXc6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBuYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgaWQ6IHN0cmluZyxcclxuICAgICAgICAgICAgICAgICAqICBhbmltYXRlZDogYm9vbGVhblxyXG4gICAgICAgICAgICAgICAgICogfVtdfVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBsZXQgZW1vamlzID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IFtdXHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IG5vZGUgb2YgY29udGVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZihub2RlKSAhPT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1BhcnNlZCA9IGZhbHNlXHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWQgPSBDb25zdGFudHMuRW1vamlSZWdleC5leGVjKG5vZGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQYXJzZWQgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighRW1vamlNb2R1bGVBcGkpRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IEVtb2ppTW9kdWxlQXBpLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKHBhcnNlZFsyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVtb2ppKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBlbW9qaS5hbmltYXRlZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZW1vamkubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGVkOiBwYXJzZWRbMF0uc3RhcnRzV2l0aChcIjxhXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwYXJzZWRbMV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBwYXJzZWRbMl0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdzogcGFyc2VkWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHBhcnNlZCk7XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICBpZihoYXNQYXJzZWQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3b3JkcyA9IG5vZGUuc3BsaXQoXCIgXCIpLm1hcCgod29yZCwgaW5kZXgsIGFycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXdvcmQpcmV0dXJuIFwiXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtb2ppID0gZW1vamlzLmZpbmQoZSA9PiBlLnJhdyA9PSB3b3JkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWVtb2ppKXJldHVybiB3b3JkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighQ3VzdG9tRW1vamlNb2R1bGUpQ3VzdG9tRW1vamlNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5DdXN0b21FbW9qaSlbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KEN1c3RvbUVtb2ppTW9kdWxlLkN1c3RvbUVtb2ppLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamk6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYC4ke2Vtb2ppLm5hbWV9LmAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppSWQ6IGVtb2ppLmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bWJvYWJsZTogYXJyLmxlbmd0aCA9PT0gMSAmJiBjb250ZW50Lmxlbmd0aCA9PT0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLnJlZHVjZSgocHJldmlvdXMsIGN1cnJlbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZXZpb3VzLmxlbmd0aCA9PT0gMClyZXR1cm4gW2N1cnJlbnRdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV0gKz0gYCAke2N1cnJlbnR9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIitjdXJyZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMucHVzaChcIiBcIiwgY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCBbXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKC4uLndvcmRzKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LnB1c2gobm9kZSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnRbMF0pe1xyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudC5zaGlmdCgpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB3aGlsZShuZXdDb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQucHVzaChuZXdDb250ZW50LnNoaWZ0KCkpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH19KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vdGVSZW5kZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKXtcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gRChlLCB0LCBuLCByLCBvLCBpLCBzLCB1LCBsLCBjKSB7XHJcbiAgICBpZiAobnVsbCA9PSBuIHx8IDAgPT09IG4ubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIHZhciBkID0gbi5tYXAoKGZ1bmN0aW9uKGUsIG4pIHtcclxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh1LCBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgb25DbGljazogbyxcclxuICAgICAgICAgICAgb25Ib3ZlcjogcixcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHQgPT09IG4sXHJcbiAgICAgICAgICAgIGluZGV4OiBuXHJcbiAgICAgICAgfSwgbChlLCBuKSkpXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gW1IoaSwgcywgZSwgYyksIGRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFIoZSwgdCwgbiwgcikge1xyXG4gICAgdmFyIGEgPSAobi5sZW5ndGggPiAwID8gZS5mb3JtYXQoe1xyXG4gICAgICAgIHByZWZpeDogcihuKVxyXG4gICAgfSkgOiB0KVxyXG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSl7XHJcbiAgICAgICAgYS51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwge30sIFwiW0xpZ2h0Y29yZF0gXCIpKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgYSA9IFwiW0xJR0hUQ09SRF0gXCIrYVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuVGl0bGUsIHtcclxuICAgICAgICB0aXRsZTogYVxyXG4gICAgfSwgYSlcclxufVxyXG5SLmRpc3BsYXlOYW1lID0gXCJyZW5kZXJIZWFkZXJcIjtcclxuXHJcbmxldCBFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxubGV0IGlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlICYmIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcbmxldCBpc1VzYWJsZSA9IGZhbHNlXHJcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcclxuXHJcbmZ1bmN0aW9uIHNldEVtb2ppVXNhYmxlKHVzYWJsZSl7XHJcbiAgICBpc1VzYWJsZSA9IHVzYWJsZVxyXG4gICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlyZXR1cm5cclxuICAgIGlmKCFpc0Vtb2ppRGlzYWJsZWQpaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxuXHJcbiAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQgPSBmdW5jdGlvbihlbW9qaSl7XHJcbiAgICAgICAgaWYoaXNVc2FibGUpe1xyXG4gICAgICAgICAgICBpZihlbW9qaS5zdXJyb2dhdGVzIHx8IGVtb2ppLmRpdmVyc2l0eSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRW1vamlEaXNhYmxlZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgIH1cclxufSIsImltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5pbXBvcnQgKiBhcyBlbGVjdHJvbiBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0gfSBmcm9tIFwiZnNcIlxyXG5pbXBvcnQgeyBiYXNlbmFtZSB9IGZyb20gXCJwYXRoXCJcclxuXHJcbmNvbnN0IGNhY2hlID0ge31cclxuY29uc3QgY2FjaGUyID0ge31cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBQbHVnaW5DZXJ0aWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXt9XHJcblxyXG4gICAgcGF0Y2goYXR0YWNobWVudCwgaWQpe1xyXG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50LCBpZClcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGlzVHJ1c3RlZChoYXNoKXtcclxuICAgICAgICByZXR1cm4gY2FjaGVbaGFzaF0gJiYgIWNhY2hlW2hhc2hdLnN1c3BlY3RcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2spe1xyXG4gICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoXCJ1dGY4XCIpLnNwbGl0KC9bXlxcd1xcZF0rL2cpXHJcbiAgICBsZXQgaXNIYXJtZnVsID0gZmFsc2VcclxuICAgIGZvcihsZXQga2V5d29yZCBvZiBkYXRhKXtcclxuICAgICAgICBmb3IobGV0IG9vZiBvZiBbXHJcbiAgICAgICAgICAgIFwidG9rZW5cIixcclxuICAgICAgICAgICAgXCJlbWFpbFwiLFxyXG4gICAgICAgICAgICBcInBob25lXCIsXHJcbiAgICAgICAgICAgIFwiTUZBXCIsXHJcbiAgICAgICAgICAgIFwiMmZhXCIsXHJcbiAgICAgICAgICAgIFwicHJvY2Vzc1wiLFxyXG4gICAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcclxuICAgICAgICAgICAgXCJsb2NhbFN0b3JhZ2VcIixcclxuICAgICAgICAgICAgXCJldmFsXCIsXHJcbiAgICAgICAgICAgIFwiZ2V0R2xvYmFsXCIsXHJcbiAgICAgICAgICAgIFwiQnJvd3NlcldpbmRvd1wiXHJcbiAgICAgICAgXSl7XHJcbiAgICAgICAgICAgIGlmKGtleXdvcmQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhvb2YudG9Mb3dlckNhc2UoKSkpe1xyXG4gICAgICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJ0b2tlbiBzdGVhbGVyL3ZpcnVzXCJcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgbm9fY29tbWVudHMgPSBkYXRhLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98KFteXFxcXDpdfF4pXFwvXFwvLiokL2dtLCBcIlwiKS50cmltKCkvLyByZW1vdmluZyB0aGUgTUVUQSBjb21tZW50IGZyb20gcGx1Z2luc1xyXG4gICAgICAgIGlmKCgvdmFyIFtcXHdcXGRfJF0rPVxcW1wiL2dpKS50ZXN0KG5vX2NvbW1lbnRzKSl7XHJcbiAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4cHMgPSBbXHJcbiAgICAgICAgICAgICAgICAvKiogaGV4YWRlY2ltYWwgKi9cclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIF8weDhkYjcoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgICAgIC8qKiBtYW5nbGVkICovXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydcXCkvZywgLy8gYignMHgwJylcclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIGIoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBmb3IobGV0IHJlZ2V4IG9mIHJlZ2V4cHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSByZWdleC50ZXN0KG5vX2NvbW1lbnRzKSA/IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIiA6IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYoIWlzSGFybWZ1bClyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soKVxyXG4gICAgY2FjaGVbaGFzaF0gPSB7XHJcbiAgICAgICAgc3VzcGVjdDogdHJ1ZSxcclxuICAgICAgICBuYW1lOiBoYXNoVG9VcmxbaGFzaF0uc3BsaXQoXCIvXCIpLnBvcCgpLFxyXG4gICAgICAgIHR5cGU6IGhhc2hUb1VybFtoYXNoXS5lbmRzV2l0aChcIi5qc1wiKSA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCIsXHJcbiAgICAgICAgaGFybTogaXNIYXJtZnVsXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGBGb3VuZCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgJHtjYWNoZVtoYXNoXS50eXBlLnRvTG93ZXJDYXNlKCl9OiAke2NhY2hlW2hhc2hdLm5hbWV9YClcclxuXHJcbiAgICByZXN1bHRDYWxsYmFjayhjYWNoZVtoYXNoXSlcclxufVxyXG5cclxuY29uc3QgaGFzaFRvVXJsID0ge31cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0hhc2goaGFzaCwgZGF0YSwgZmlsZW5hbWUsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayl7XHJcbiAgICBjb25zb2xlLmxvZyhgRmlsZTogJHtmaWxlbmFtZX0gaGFzaDogJHtoYXNofWApXHJcbiAgICBpZighY2FjaGVbaGFzaF0pe1xyXG4gICAgICAgIG5vZGVGZXRjaChcImh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9MaWdodGNvcmQvZmlsZWhhc2hlc0BtYXN0ZXIvaGFzaGVzL1wiK2hhc2gsIHsgLy8gVXNpbmcgbm9kZS1mZXRjaCB0byBieXBhc3MgY29yc1xyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIlVzZXItQWdlbnRcIjogZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpLnVzZXJBZ2VudCAvLyBoYXZlIHRvIHNldCB1c2VyLWFnZW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl7XHJcbiAgICAgICAgICAgICAgICBpZihmaWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpcmV0dXJuIHJlbW92ZUNhbGxiYWNrKClcclxuICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHdyb25nQ2FsbGJhY2spXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxyXG5cclxuICAgICAgICAgICAgY2FjaGVbaGFzaF0gPSByZXN1bHRcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHJlc3VsdClcclxuICAgICAgICB9KS5jYXRjaCgoKT0+e30pXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBjYWNoZVtoYXNoXVxyXG5cclxuICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzRmlsZShfX3BhdGgsIHJlc3VsdENhbGxiYWNrLCByZW1vdmVDYWxsYmFjayl7ICAgIFxyXG4gICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKVxyXG5cclxuICAgIGNyZWF0ZVJlYWRTdHJlYW0oX19wYXRoKS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgIGRhdGEgPSBCdWZmZXIuY29uY2F0KFtkYXRhLCBjaHVua10pXHJcbiAgICAgICAgaGFzaC51cGRhdGUoY2h1bmspXHJcbiAgICB9KS5vbihcImVuZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IF9fcGF0aFxyXG5cclxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKXtcclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpcmV0dXJuXHJcbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICBpZighYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuXHJcbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxyXG4gICAgICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBhdHRhY2htZW50LnVybFxyXG5cclxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSlcclxuICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pLmNhdGNoKCgpPT57fSlcclxufVxyXG5cclxubGV0IGZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG5sZXQgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF1cclxuXHJcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgb2ZmaWNpYWw/OiBib29sZWFufXx7c3VzcGVjdDp0cnVlLCB0eXBlOiBcIlRoZW1lXCJ8XCJQbHVnaW5cIiwgbmFtZTogc3RyaW5nLCBoYXJtOiBzdHJpbmd9fSByZXN1bHRcclxuICovXHJcbmZ1bmN0aW9uIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgZmlsZW5hbWUpe1xyXG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpXHJcbiAgICBpZighZGl2IHx8IGRpdi5jaGlsZE5vZGVzLmxlbmd0aCA+IDApcmV0dXJuIC8vIGFscmVhZHkgY2VydGlmaWVkL2RpdiBkb2VzIG5vdCBleGlzdCBhbnltb3JlLlxyXG5cclxuICAgIGlmKCFmbG93ZXJTdGFyTW9kdWxlKWZsb3dlclN0YXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbG93ZXJTdGFyQ29udGFpbmVyKVswXVxyXG4gICAgaWYoIWNoaWxkTW9kdWxlKWNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgIGlmKHJlc3VsdC5zdXNwZWN0KXtcclxuICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCJyZ2IoMjQwLCA3MSwgNzEpXCJcclxuICAgICAgICAgICAgLyoqXHJcbiAgICAgICAgICAgICAqIFxyXG4gICAgICAgICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIFxyXG4gICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgbGV0IG5leHROb2RlID0gKG5vZGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbil7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJBXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dDb25maXJtYXRpb25Nb2RhbChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkb3dubG9hZCB0aGlzID9cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiAqKlwiK2ZpbGVuYW1lK1wiKiogbWlnaHQgYmUgZGFuZ2Vyb3VzICoqKFwiK3Jlc3VsdC5oYXJtK1wiKSoqLiBcXG5cXG4qKldlIGRvbid0IHJlY29tbWFuZCB0byBkb3dubG9hZCBpdCoqLiBIb3dldmVyLCB5b3UgY2FuIHN0aWxsIGRvIGl0IGJlbG93LlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRvd25sb2FkIEFueXdheVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxUZXh0OiBcIkRvbid0ICFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Ryb24ucmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChjaGlsZC5ocmVmKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKFtcImRpdlwiXS5pbmNsdWRlcyhjaGlsZC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG5leHROb2RlKGRpdi5wYXJlbnROb2RlKVxyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiBpcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMuXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIxNnB4XCIsIGhlaWdodDogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdmcpWzBdLnN2ZywgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCA0MCAzMlwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJyZWN0XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgeDpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgeTpcIjBcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6XCIzMlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTMyKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsOlwiI2YwNDc0N1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXNrOlwidXJsKCNzdmctbWFzay1zdGF0dXMtZG5kKVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6QkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0ucG9pbnRlckV2ZW50c1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZSBpZighcmVzdWx0Lm9mZmljaWFsKXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMTZweFwiLGhlaWdodDpcIjE2cHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtmaWxsOlwiI2ZmZmZmZlwiLGQ6XCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApLCBkaXYpXHJcbiAgICB9ZWxzZXtcclxuICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwiIzQwODdlZFwiXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgd2FzIG1hZGUgYnkgdGhlIGRldmVsb3BlcnMgb2YgTGlnaHRjb3JkLlwiLHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjE2cHhcIixoZWlnaHQ6XCIxNnB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCIsc3Ryb2tlOlwiIzM2MzkzZlwiLHN0eWxlOntjb2xvcjpcIiM0MDg3ZWRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCJjdXJyZW50Q29sb3JcIiwgXCJmaWxsLXJ1bGVcIjpcImV2ZW5vZGRcIixkOlwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwifSlcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1wiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIxNnB4XCIsaGVpZ2h0OlwiMTZweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwifSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtiZHBsdWdpbkVycm9ycywgcGx1Z2luQ29va2llLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XHJcbmltcG9ydCBCREV2ZW50cyBmcm9tIFwiLi9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuXHJcbmNsYXNzIFBsdWdpbk1vZHVsZSB7XHJcbiAgICBnZXQgZm9sZGVyKCkge3JldHVybiBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyO31cclxufVxyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2lucyA9IGFzeW5jIGZ1bmN0aW9uICgpIHtcclxuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcclxuICAgIGJkcGx1Z2luRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFBsdWdpbnMoKSkpO1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcGx1Z2luLCBuYW1lO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgICAgICBuYW1lID0gcGx1Z2luLmdldE5hbWUoKTtcclxuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICBwbHVnaW5Db29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcclxuICAgICAgICAgICAgYmRwbHVnaW5FcnJvcnMucHVzaCh7bmFtZTogbmFtZSwgZmlsZTogYmRwbHVnaW5zW3BsdWdpbnNbaV1dLmZpbGVuYW1lLCBtZXNzYWdlOiBcImxvYWQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbbmFtZV0pIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAocGx1Z2luQ29va2llW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IGhhcyBzdGFydGVkLmApO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIHN0YXJ0ZWQuXCIsIGVycik7XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbkVycm9ycy5wdXNoKHtuYW1lOiBuYW1lLCBmaWxlOiBiZHBsdWdpbnNbcGx1Z2luc1tpXV0uZmlsZW5hbWUsIG1lc3NhZ2U6IFwic3RhcnQoKSBjb3VsZCBub3QgYmUgZmlyZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XHJcblxyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5vbihcImRpZC1uYXZpZ2F0ZS1pbi1wYWdlXCIsIHRoaXMuY2hhbm5lbFN3aXRjaC5iaW5kKHRoaXMpKTtcclxuICAgIC8vIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdGFydFBsdWdpbiA9IGZ1bmN0aW9uKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdGFydGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgICAgICBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIHBsdWdpbiArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zdG9wUGx1Z2luID0gZnVuY3Rpb24ocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgICBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uc3RvcCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0b3BwZWQuYCk7XHJcbiAgICB9XHJcbiAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RvcHBlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpICsgXCIgY291bGQgbm90IGJlIHN0b3BwZWQuXCIsIGVycik7XHJcbiAgICB9XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAocGx1Z2luQ29va2llW3BsdWdpbl0pIHJldHVybjtcclxuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcclxuICAgIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW5dKSByZXR1cm47XHJcbiAgICBwbHVnaW5Db29raWVbcGx1Z2luXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xyXG4gICAgdGhpcy5zdG9wUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlUGx1Z2luID0gZnVuY3Rpb24gKHBsdWdpbikge1xyXG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luKTtcclxuICAgIGVsc2UgdGhpcy5lbmFibGVQbHVnaW4ocGx1Z2luKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudG9nZ2xlID0gZnVuY3Rpb24gKHBsdWdpbiwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHJldHVybiB0aGlzLnRvZ2dsZVBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW4gPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IChjb25zb2xlLmxvZyhwLmZpbGVuYW1lLCBmaWxlbmFtZSkpIHx8IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpLnBsdWdpbjtcclxuICAgIHRyeSB7IGlmIChwbHVnaW4ubG9hZCAmJiB0eXBlb2YocGx1Z2luLmxvYWQpID09IFwiZnVuY3Rpb25cIikgcGx1Z2luLmxvYWQoKTt9XHJcbiAgICBjYXRjaCAoZXJyKSB7aWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycl19KTt9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2luLmdldE5hbWUoKX0gdiR7cGx1Z2luLmdldFZlcnNpb24oKX0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLWxvYWRlZFwiLCBwbHVnaW4uZ2V0TmFtZSgpKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudW5sb2FkUGx1Z2luID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcclxuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XHJcbiAgICBjb25zdCBlcnJvciA9IENvbnRlbnRNYW5hZ2VyLnVubG9hZENvbnRlbnQoYmRwbHVnaW5zW3BsdWdpbl0uZmlsZW5hbWUsIFwicGx1Z2luXCIpO1xyXG4gICAgZGVsZXRlIGJkcGx1Z2luc1twbHVnaW5dO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7cGx1Z2luczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbn0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB3YXMgdW5sb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXVubG9hZGVkXCIsIHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkUGx1Z2luKGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybiB0aGlzLmxvYWRQbHVnaW4oZmlsZW5hbWVPck5hbWUpO1xyXG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcclxuICAgIGNvbnN0IGVuYWJsZWQgPSBwbHVnaW5Db29raWVbcGx1Z2luXTtcclxuICAgIGlmIChlbmFibGVkKSB0aGlzLnN0b3BQbHVnaW4ocGx1Z2luLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBpZiAoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQgJiYgdHlwZW9mKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKCk7XHJcbiAgICBpZiAoZW5hYmxlZCkgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHRydWUpO1xyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwicGx1Z2luLXJlbG9hZGVkXCIsIHBsdWdpbik7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFBsdWdpbihuYW1lKTtcclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmRwbHVnaW5zKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmRwbHVnaW5zW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmdWxsUGF0aCk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZVBsdWdpbkxpc3QgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkUGx1Z2luKG5hbWUpO1xyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5sb2FkUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHBsdWdpbkNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJwbHVnaW5zXCIsIHBsdWdpbkNvb2tpZSk7XHJcbn07XHJcblxyXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLm5ld01lc3NhZ2UgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vbk1lc3NhZ2UoKTsgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZXJyKSB7IFV0aWxzLmVycihcIlBsdWdpbnNcIiwgXCJVbmFibGUgdG8gZmlyZSBvbk1lc3NhZ2UgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59O1xyXG5cclxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5jaGFubmVsU3dpdGNoID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgcGx1Z2lucyA9IE9iamVjdC5rZXlzKGJkcGx1Z2lucyk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xyXG4gICAgICAgIGlmICghcGx1Z2luQ29va2llW3BsdWdpbi5nZXROYW1lKCldKSBjb250aW51ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vblN3aXRjaCgpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uU3dpdGNoIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcblBsdWdpbk1vZHVsZS5wcm90b3R5cGUucmF3T2JzZXJ2ZXIgPSBmdW5jdGlvbihlKSB7XHJcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIGNvbnN0IHBsdWdpbiA9IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5wbHVnaW47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcclxuICAgICAgICAgICAgdHJ5IHsgcGx1Z2luLm9ic2VydmVyKGUpOyB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9ic2VydmVyIGZvciBcIiArIHBsdWdpbi5nZXROYW1lKCkgKyBcIi5cIiwgZXJyKTsgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBQbHVnaW5Nb2R1bGUoKTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgVjJDX1B1YmxpY1NlcnZlcnMgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgTGF5ZXIgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwiLCBpZDogXCJwdWJzbGF5ZXJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHVibGljU2VydmVycywge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCJ9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInB1YnNsYXllcnJvb3RcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXJzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpWzBdLmxheWVycy5zcGxpdChcIiBcIilbMF1cclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gRE9NLnF1ZXJ5KFwiLmxheWVycywgLlwiK2NsYXNzTmFtZUxheWVycyk7XHJcbiAgICAgICAgaWYgKCFsYXllcnMpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBsYXllcnMuYXBwZW5kKERPTS5jcmVhdGVFbGVtZW50KFwiPGRpdiBpZD0ncHVic2xheWVycm9vdCc+XCIpKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IC5sYXllcnNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBidXR0b24oKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItbGlcIiBjbGFzcz1cIiR7QkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW19XCI+YCk7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBidG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xyXG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7dGhpcy5yZW5kZXIoKTt9KTtcclxuICAgICAgICBidG4uYXBwZW5kKGxhYmVsKTtcclxuICAgICAgICByZXR1cm4gYnRuO1xyXG4gICAgfVxyXG5cclxuICAgIF9hcHBlbmRCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lU2Nyb2xsZXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlciAmJiBlLnNjcm9sbGJhcldpZHRoKVswXS5zY3JvbGxlclxyXG4gICAgICAgIF1cclxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHdyYXBwZXIgPSBCRFYyLmd1aWxkQ2xhc3Nlcy53cmFwcGVyLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICBjb25zdCBndWlsZHMgPSBET00ucXVlcnkoYC4ke3dyYXBwZXJ9IC4ke2NsYXNzTmFtZVNjcm9sbGVyfSA+OmZpcnN0LWNoaWxkYCk7XHJcbiAgICAgICAgRE9NLmFmdGVyKGd1aWxkcywgdGhpcy5idXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEJ1dHRvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0ID0gd2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJOYXZpZ2FibGVHdWlsZHNcIik7XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0T2xkID0gd2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZExpc3QgPyBHdWlsZExpc3QgOiBHdWlsZExpc3RPbGQucHJvdG90eXBlLCBHdWlsZExpc3QgPyBcImRlZmF1bHRcIiA6IFwicmVuZGVyXCIsIHthZnRlcjogdGhpcy5fYXBwZW5kQnV0dG9ufSk7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmd1aWxkUGF0Y2g7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKS5yZW1vdmUoKTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcblxyXG5jb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKTtcclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuXHJcbmNvbnN0IEJyb3dzZXJXaW5kb3cgPSBlbGVjdHJvbi5yZW1vdGUuQnJvd3NlcldpbmRvdztcclxuY29uc3Qgd2ViQ29udGVudHMgPSBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIHJlYWN0RGV2VG9vbHMge1xyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgbGV0IGV4dGVuc2lvblBhdGggPSBcIlwiO1xyXG4gICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcIndpbjMyXCIpIGV4dGVuc2lvblBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5lbnYuTE9DQUxBUFBEQVRBLCBcIkdvb2dsZS9DaHJvbWUvVXNlciBEYXRhXCIpO1xyXG4gICAgICAgIGVsc2UgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwibGludXhcIikgZXh0ZW5zaW9uUGF0aCA9IHBhdGgucmVzb2x2ZShwcm9jZXNzLmVudi5IT01FLCBcIi5jb25maWcvZ29vZ2xlLWNocm9tZVwiKTtcclxuICAgICAgICBlbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsIFwiTGlicmFyeS9BcHBsaWNhdGlvbiBTdXBwb3J0L0dvb2dsZS9DaHJvbWVcIik7XHJcbiAgICAgICAgZWxzZSBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuZW52LkhPTUUsIFwiLmNvbmZpZy9jaHJvbWl1bVwiKTtcclxuICAgICAgICBleHRlbnNpb25QYXRoICs9IFwiL0RlZmF1bHQvRXh0ZW5zaW9ucy9mbWthZG1hcGdvZmFkb3BsamJqZmthcGRrb2llbmloaS9cIjtcclxuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhleHRlbnNpb25QYXRoKSkge1xyXG4gICAgICAgICAgICBjb25zdCB2ZXJzaW9ucyA9IGZzLnJlYWRkaXJTeW5jKGV4dGVuc2lvblBhdGgpO1xyXG4gICAgICAgICAgICBleHRlbnNpb25QYXRoID0gcGF0aC5yZXNvbHZlKGV4dGVuc2lvblBhdGgsIHZlcnNpb25zW3ZlcnNpb25zLmxlbmd0aCAtIDFdKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5leHRlbnNpb25QYXRoID0gZXh0ZW5zaW9uUGF0aDtcclxuICAgICAgICB0aGlzLmlzRXh0ZW5zaW9uSW5zdGFsbGVkID0gZnMuZXhpc3RzU3luYyhleHRlbnNpb25QYXRoKTtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyID0gdGhpcy5saXN0ZW5lci5iaW5kKHRoaXMpO1xyXG5cclxuICAgICAgICBzZXR0aW5nc1tcIlJlYWN0IERldlRvb2xzXCJdLmhpZGRlbiA9ICF0aGlzLmlzRXh0ZW5zaW9uSW5zdGFsbGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGxpc3RlbmVyKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0V4dGVuc2lvbkluc3RhbGxlZCkgcmV0dXJuO1xyXG4gICAgICAgIEJyb3dzZXJXaW5kb3cucmVtb3ZlRGV2VG9vbHNFeHRlbnNpb24oXCJSZWFjdCBEZXZlbG9wZXIgVG9vbHNcIik7XHJcbiAgICAgICAgY29uc3QgZGlkSW5zdGFsbCA9IEJyb3dzZXJXaW5kb3cuYWRkRGV2VG9vbHNFeHRlbnNpb24odGhpcy5leHRlbnNpb25QYXRoKTtcclxuXHJcbiAgICAgICAgaWYgKGRpZEluc3RhbGwpIFV0aWxzLmxvZyhcIlJlYWN0IERldlRvb2xzXCIsIFwiU3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCByZWFjdCBkZXZ0b29scy5cIik7XHJcbiAgICAgICAgZWxzZSBVdGlscy5lcnIoXCJSZWFjdCBEZXZUb29sc1wiLCBcIkNvdWxkbid0IGZpbmQgcmVhY3QgZGV2dG9vbHMgaW4gY2hyb21lIGV4dGVuc2lvbnMhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB3ZWJDb250ZW50cy5vbihcImRldnRvb2xzLW9wZW5lZFwiLCB0aGlzLmxpc3RlbmVyKSk7XHJcbiAgICAgICAgaWYgKHdlYkNvbnRlbnRzLmlzRGV2VG9vbHNPcGVuZWQoKSkgdGhpcy5saXN0ZW5lcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgd2ViQ29udGVudHMucmVtb3ZlTGlzdGVuZXIoXCJkZXZ0b29scy1vcGVuZWRcIiwgdGhpcy5saXN0ZW5lcik7XHJcbiAgICB9XHJcbn07ICAiLCJpbXBvcnQge3NldHRpbmdzLCBzZXR0aW5nc0Nvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lcywgc2V0dGluZ3NSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIGZyb20gXCIuL3NldHRpbmdzUGFuZWxTaWRlYmFyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcclxuaW1wb3J0IEJERXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xyXG5pbXBvcnQgdGZIb3VyIGZyb20gXCIuLzI0aG91clwiO1xyXG5pbXBvcnQgcmVhY3REZXZUb29scyBmcm9tIFwiLi9yZWFjdERldlRvb2xzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBwdWJsaWNTZXJ2ZXJzTW9kdWxlIGZyb20gXCIuL3B1YmxpY1NlcnZlcnNcIjtcclxuaW1wb3J0IHZvaWNlTW9kZSBmcm9tIFwiLi92b2ljZU1vZGVcIjtcclxuaW1wb3J0IENsYXNzTm9ybWFsaXplciBmcm9tIFwiLi9jbGFzc05vcm1hbGl6ZXJcIjtcclxuaW1wb3J0IGRNb2RlIGZyb20gXCIuL2Rldk1vZGVcIjtcclxuXHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi4vdWkvdG9vbHNcIjtcclxuaW1wb3J0IFNjcm9sbGVyIGZyb20gXCIuLi91aS9zY3JvbGxlclwiO1xyXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQ3NzRWRpdG9yIGZyb20gXCIuLi91aS9jc3NFZGl0b3JcIjtcclxuaW1wb3J0IENhcmRMaXN0IGZyb20gXCIuLi91aS9hZGRvbmxpc3RcIjtcclxuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4vQ3VzdG9tUmljaFByZXNlbmNlXCI7XHJcbmltcG9ydCBWMkNfQWNjb3VudEluZm9zIGZyb20gXCIuLi91aS9BY2NvdW50SW5mb3NcIjtcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBBbnRpQWRETSBmcm9tIFwiLi9BbnRpQWRETVwiO1xyXG5pbXBvcnQgYmx1clByaXZhdGUgZnJvbSBcIi4vYmx1clByaXZhdGVcIjtcclxuaW1wb3J0IGRpc2FibGVUeXBpbmcgZnJvbSBcIi4vZGlzYWJsZVR5cGluZ1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyX1NldHRpbmdzUGFuZWwge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc2lkZUJhck9uQ2xpY2sgPSB0aGlzLnNpZGVCYXJPbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIodGhpcy5zaWRlQmFyT25DbGljayk7XHJcbiAgICAgICAgLy8gdGhpcy5idWlsZFBsdWdpblByb3BzID0gdGhpcy5idWlsZFBsdWdpblByb3BzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgLy8gdGhpcy5idWlsZFRoZW1lUHJvcHMgPSB0aGlzLmJ1aWxkVGhlbWVQcm9wcy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd09yaWdpbmFsID0gdGhpcy5zaG93T3JpZ2luYWwuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1zZXR0aW5nc3BhbmUtY29udGFpbmVyXCIpO1xyXG4gICAgICAgIGlmICghX3Jvb3QpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluamVjdFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3RSb290KCkge1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUxheWVyLFxyXG4gICAgICAgICAgICBjbGFzc1NpZGViYXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIuc3BsaXQoXCIgXCIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zdGFuZGFyZFNpZGViYXJWaWV3KVswXVxyXG4gICAgICAgIF1cclxuICAgICAgICBjb25zdCBzaWRlYmFyID0gRE9NLnF1ZXJ5KFwiLlwiK2NsYXNzTmFtZUxheWVyK1wiIC5cIitjbGFzc1NpZGViYXIuc3RhbmRhcmRTaWRlYmFyVmlldy5zcGxpdChcIiBcIilbMF0rXCIsIC5cIitjbGFzc05hbWVMYXllcitcIiAudWktc3RhbmRhcmQtc2lkZWJhci12aWV3XCIpO1xyXG4gICAgICAgIGlmICghc2lkZWJhcikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXNldHRpbmdzcGFuZS1jb250YWluZXJcIiBjbGFzcz1cIiR7Y2xhc3NTaWRlYmFyLmNvbnRlbnRSZWdpb259IGNvbnRlbnQtcmVnaW9uXCI+YCk7XHJcbiAgICAgICAgc2lkZWJhci5hcHBlbmQocm9vdCk7XHJcblxyXG4gICAgICAgIFV0aWxzLm9uUmVtb3ZlZChyb290LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShyb290KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29yZVNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHNldHRpbmdzID0gdGhpcy5nZXRTZXR0aW5ncyhcImNvcmVcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaWdodGNvcmRTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJsaWdodGNvcmRcIik7XHJcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFsuLi5uZXcgU2V0KHNldHRpbmdzLm1hcChzID0+IHMuY2F0ZWdvcnkpKV07XHJcbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBjYXRlZ29yaWVzLm1hcChjID0+IHtyZXR1cm4ge3RpdGxlOiBjLCBzZXR0aW5nczogc2V0dGluZ3MuZmlsdGVyKHMgPT4gcy5jYXRlZ29yeSA9PSBjKX07fSk7XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBQcmVzZW5jZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwic3RhdHVzXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IE1zZ0xvZ1NldHRpbmdzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmdldFNldHRpbmdzKFwibXNnbG9nXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2V0dGluZ3MoY2F0ZWdvcnkpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc2V0dGluZ3MpLnJlZHVjZSgoYXJyLCBrZXkpID0+IHtcclxuICAgICAgICAgICAgY29uc3Qgc2V0dGluZyA9IHNldHRpbmdzW2tleV07XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5nLmNhdCA9PT0gY2F0ZWdvcnkgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxuICAgIHNpZGVCYXJPbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3QgY29udGVudFJlZ2lvbiA9IERPTS5xdWVyeShcIi5jb250ZW50UmVnaW9uLTNuRHVZeSwgLmNvbnRlbnQtcmVnaW9uXCIpO1xyXG4gICAgICAgIGNvbnRlbnRSZWdpb24uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIHRoaXMucm9vdC5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjb3JlXCI6XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlckNvcmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJjdXN0b21jc3NcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyQ3VzdG9tQ3NzRWRpdG9yKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInBsdWdpbnNcIjpcclxuICAgICAgICAgICAgY2FzZSBcInRoZW1lc1wiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJBZGRvblBhbmUoaWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaWdodGNvcmRcIjpcclxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTGlnaHRjb3JkU2V0dGluZ3MoKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICAgICAgY2FzZSBcInN0YXR1c1wiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJQcmVzZW5jZVNldHRpbmdzKClcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIGNhc2UgXCJhY2NvdW50aW5mb1wiOlxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJBY2NvdW50SW5mb3MoKVxyXG4gICAgICAgICAgICAgICAgYnJlYWtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHt9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKGlkLCBjaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVTZXR0aW5ncyhpZCwgZW5hYmxlZCkge1xyXG4gICAgICAgIHNldHRpbmdzQ29va2llW2lkXSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0yXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0zXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgICAgICBlbHNlIHB1YmxpY1NlcnZlcnNNb2R1bGUucmVtb3ZlQnV0dG9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSB2b2ljZU1vZGUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiBpZCA9PSBcImJkYS1ncy02XCIpIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTdcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICAgICAgZWxzZSBjb2xvcmVkVGV4dC5yZW1vdmVDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy00XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgICAgICBlbHNlIENsYXNzTm9ybWFsaXplci5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLnVud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstd3AtMVwiKSB7XHJcbiAgICAgICAgICAgIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJ0cmFuc3BhcmVudFwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGVsc2UgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBcIiMyZjMxMzZcIik7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLThcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstZG0tMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJyZWFjdERldlRvb2xzXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSByZWFjdERldlRvb2xzLnN0b3AoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC0xXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTJcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5jYWxsUmluZ2luZ0JlYXQgPSBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBzZXR0aW5nc1N0b3JlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiB0eXBlb2YgZS5kZWZhdWx0ID09PSBcIm9iamVjdFwiICYmIFwic2hvd0N1cnJlbnRHYW1lXCIgaW4gZS5kZWZhdWx0KVswXVxyXG4gICAgICAgICAgICAgICAgaWYoc2V0dGluZ3NTdG9yZSAmJiAhc2V0dGluZ3NTdG9yZS5kZWZhdWx0LnNob3dDdXJyZW50R2FtZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3MpWzBdLmRlZmF1bHQudXBkYXRlUmVtb3RlU2V0dGluZ3Moe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93Q3VycmVudEdhbWU6IHRydWVcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgQ3VzdG9tUmljaFByZXNlbmNlLmRpc2FibGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTNcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgICAgICBlbHNlIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AoZmFsc2UpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTZcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGJsdXJQcml2YXRlLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZGlzYWJsZSgpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC03XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgZGlzYWJsZVR5cGluZy5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llLnJlYWN0RGV2VG9vbHMpIHJlYWN0RGV2VG9vbHMuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMlwiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtM1wiXSkgRE9NLmFkZENsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbC1jaGFuXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy00XCJdKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNVwiXSkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTZcIl0pIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtN1wiXSkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTRcIl0pIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0xXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTJcIl0pIHdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuY2FsbFJpbmdpbmdCZWF0ID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC1wcmVzZW5jZS0xXCJdKSBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtM1wiXSkgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcCh0cnVlKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC00XCJdKSBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC02XCJdKSBibHVyUHJpdmF0ZS5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC03XCJdKSBkaXNhYmxlVHlwaW5nLmVuYWJsZSgpXHJcblxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSkge1xyXG4gICAgICAgICAgICBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJwbHVnaW5cIik7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLThcIl0pIGRNb2RlLnN0YXJ0RGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstZG0tMVwiXSkgZE1vZGUuc3RhcnRDb3B5U2VsZWN0b3IoKTtcclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIsIHNldHRpbmdzQ29va2llKTtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicnBjXCIsIHNldHRpbmdzUlBDKTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInNldHRpbmdzXCIpKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwicnBjXCIpKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93T3JpZ2luYWwoKSB7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMucm9vdCk7XHJcbiAgICAgICAgdGhpcy5yb290LnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcclxuICAgICAgICBET00ucXVlcnkoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudFJlZ2lvbilbMF0uY29udGVudFJlZ2lvbi5zcGxpdChcIiBcIilbMF0rXCIsIC5jb250ZW50LXJlZ2lvblwiKS5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJTaWRlYmFyKCkge1xyXG4gICAgICAgIGNvbnN0IHRhYnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiW2NsYXNzKj0nc2lkZS0nXSA+IFtjbGFzcyo9J2l0ZW0tJ11cIik7XHJcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRhYnMpIHtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5zaG93T3JpZ2luYWwpO1xyXG4gICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLnNob3dPcmlnaW5hbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZW5kZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29yZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlnaHRjb3JkQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtjb250ZW50Q29sdW1uOiB0cnVlLCBmYWRlOiB0cnVlLCBkYXJrOiB0cnVlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlY3Rpb25lZFNldHRpbmdzUGFuZWwsIHtrZXk6IFwibHNwYW5uZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmxpZ2h0Y29yZFNldHRpbmdzfSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29scywge2tleTogXCJ0b29sc1wifSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7Y29udGVudENvbHVtbjogdHJ1ZSwgZmFkZTogdHJ1ZSwgZGFyazogdHJ1ZX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHJlc2VuY2VTZXR0aW5ncywge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcImxwcGFubmVsXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nczogdGhpcy5QcmVzZW5jZVNldHRpbmdzXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgQWNjb3VudEluZm9zQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtjb250ZW50Q29sdW1uOiB0cnVlLCBmYWRlOiB0cnVlLCBkYXJrOiB0cnVlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAgICAgIGtleTogXCJsYXBhbm5lbFwiXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3VzdG9tQ3NzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtjb250ZW50Q29sdW1uOiB0cnVlLCBmYWRlOiB0cnVlLCBkYXJrOiB0cnVlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwidG9vbHNcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJDb3JlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvcmVDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlckxpZ2h0Y29yZFNldHRpbmdzKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5saWdodGNvcmRDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclByZXNlbmNlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLlByZXNlbmNlQ29tcG9uZW50LCByb290KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXJBY2NvdW50SW5mb3MoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLkFjY291bnRJbmZvc0NvbXBvbmVudCwgcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQ3VzdG9tQ3NzRWRpdG9yKCkge1xyXG4gICAgICAgIGNvbnN0IHJvb3QgPSB0aGlzLnJvb3Q7XHJcbiAgICAgICAgaWYgKCFyb290KSByZXR1cm4gVXRpbHMuZXJyKFwiU2V0dGluZ3NQYW5lbFwiLCBcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogLmxheWVyLTNRclVlRyAuc3RhbmRhcmRTaWRlYmFyVmlldy0zRjFJN2lcIik7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jdXN0b21Dc3NDb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHJlbmRlckFkZG9uUGFuZSh0eXBlKSB7XHJcbiAgICAvLyAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgIC8vICAgICBpZiAoIXJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgIC8vICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcih0aGlzLmNvbnRlbnRDb21wb25lbnQodHlwZSksIHJvb3QpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJlbmRlckFkZG9uUGFuZSh0eXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHJldHVybiBVdGlscy5lcnIoXCJTZXR0aW5nc1BhbmVsXCIsIFwiRkFJTEVEIFRPIExPQ0FURSBST09UOiAubGF5ZXItM1FyVWVHIC5zdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aVwiKTtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICAgICAgICAgIEJERXZlbnRzLm9uKGAke3RoaXMucHJlZml4fS1yZWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub24oYCR7dGhpcy5wcmVmaXh9LWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub24oYCR7dGhpcy5wcmVmaXh9LXVubG9hZGVkYCwgdGhpcy5vbkNoYW5nZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgICAgICAgICBCREV2ZW50cy5vZmYoYCR7dGhpcy5wcmVmaXh9LXJlbG9hZGVkYCwgdGhpcy5vbkNoYW5nZSk7XHJcbiAgICAgICAgICAgICAgICBCREV2ZW50cy5vZmYoYCR7dGhpcy5wcmVmaXh9LWxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICAgICAgQkRFdmVudHMub2ZmKGAke3RoaXMucHJlZml4fS11bmxvYWRlZGAsIHRoaXMub25DaGFuZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPT09IFwicGx1Z2luc1wiID8gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpIDogT2JqZWN0LnZhbHVlcyhiZHRoZW1lcyk7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3REb20ucmVuZGVyKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDb250ZW50TGlzdCwge3R5cGUsIG9uQ2hhbmdlOiB0aGlzLnNpZGVCYXJPbkNsaWNrfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZSwgbGlzdH0pKSwgdGhpcy5yb290KTtcclxuICAgIH1cclxufTtcclxuIiwiaW1wb3J0IHtiYmRDaGFuZ2Vsb2csIExDQ2hhbmVsb2d9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFNpZGVCYXIgZnJvbSBcIi4uL3VpL3NpZGViYXJcIjtcclxuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL3VpL2ljb25zL2hpc3RvcnlcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbF9TaWRlYmFyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihvbkNsaWNrKSB7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gb25DbGljaztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXRlbXMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFt7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQmV0dGVyRGlzY29yZCBTZXR0aW5nc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY29yZVwiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlBsdWdpbnNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInBsdWdpbnNcIlxyXG4gICAgICAgIH0sIHtcclxuICAgICAgICAgICAgdGV4dDogXCJUaGVtZXNcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcInRoZW1lc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIkN1c3RvbSBDU1NcIiwgXHJcbiAgICAgICAgICAgIGlkOiBcImN1c3RvbWNzc1wiXHJcbiAgICAgICAgfV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IExDaXRlbXMoKXtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkxpZ2h0Y29yZCBTZXR0aW5nc1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwibGlnaHRjb3JkXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJSaWNoUHJlc2VuY2VcIiwgXHJcbiAgICAgICAgICAgICAgICBpZDogXCJzdGF0dXNcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkFjY291bnQgSW5mb1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwiYWNjb3VudGluZm9cIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb21wb25lbnQoKSB7XHJcbiAgICAgICAgLy88VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nQnV0dG9uID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCQkQncyBDaGFuZ2Vsb2dcIn0sIFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChIaXN0b3J5LCB7Y2xhc3NOYW1lOiBcImJkLWljb25cIiwgc2l6ZTogXCIxNnB4XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dCdXR0b25MQyA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkJ3MgQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2hhbmdlbG9nLWJ1dHRvblwiLCBvbkNsaWNrOiAoKSA9PiB7VXRpbHMuc2hvd0NoYW5nZWxvZ01vZGFsKExDQ2hhbmVsb2cpO319LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KEhpc3RvcnksIHtjbGFzc05hbWU6IFwiYmQtaWNvblwiLCBzaXplOiBcIjE2cHhcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVCYXIsIHtvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssIGhlYWRlclRleHQ6IFwiTGlnaHRjb3JkXCIsIGhlYWRlckJ1dHRvbjogY2hhbmdlbG9nQnV0dG9uTEMsIGl0ZW1zOiB0aGlzLkxDaXRlbXN9KSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwgbnVsbCwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNpZGVCYXIsIHtvbkNsaWNrOiB0aGlzLm9uQ2xpY2ssIGhlYWRlclRleHQ6IFwiQmFuZGFnZWQgQkRcIiwgaGVhZGVyQnV0dG9uOiBjaGFuZ2Vsb2dCdXR0b24sIGl0ZW1zOiB0aGlzLml0ZW1zfSkpXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByb290KCkge1xyXG4gICAgICAgIGNvbnN0IF9yb290ID0gRE9NLnF1ZXJ5KFwiI2JkLXNldHRpbmdzLXNpZGViYXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgdGFicyA9IERPTS5xdWVyeUFsbChcIltjbGFzcyo9J3NpZGUtJ10gPiBbY2xhc3MqPSdpdGVtLSddOm5vdChbY2xhc3MqPURhbmdlcl0pXCIpO1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZUxvZyA9IHRhYnNbdGFicy5sZW5ndGggLSAxXTtcclxuICAgICAgICBpZiAoIWNoYW5nZUxvZykgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNoYW5nZUxvZy5wYXJlbnRFbGVtZW50Lmluc2VydEJlZm9yZShET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLXNldHRpbmdzLXNpZGViYXJcIj5gKSwgY2hhbmdlTG9nLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByb290ID0gdGhpcy5yb290O1xyXG4gICAgICAgIGlmICghcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBMT0NBVEUgUk9PVDogW2NsYXNzKj0nc2lkZS0nXSA+IFtjbGFzcyo9J2l0ZW0tJ106bm90KFtjbGFzcyo9RGFuZ2VyXSlcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb21wb25lbnQsIHJvb3QpO1xyXG4gICAgICAgIFV0aWxzLm9uUmVtb3ZlZChyb290LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShyb290KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNsYXNzIFRoZW1lTW9kdWxlIHtcclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XHJcbn1cclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWVEYXRhKCk7XHJcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XHJcbiAgICAgICAgaWYgKCF0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgdGhlbWVDb29raWVbdGhlbWUubmFtZV0gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuICAgIH1cclxuICAgIGZvciAoY29uc3QgdGhlbWUgaW4gdGhlbWVDb29raWUpIHtcclxuICAgICAgICBpZiAoIWJkdGhlbWVzW3RoZW1lXSkgZGVsZXRlIHRoZW1lQ29va2llW3RoZW1lXTtcclxuICAgIH1cclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgLy8gaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSBDb250ZW50TWFuYWdlci53YXRjaENvbnRlbnQoXCJ0aGVtZVwiKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5lbmFibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IHRydWU7XHJcbiAgICB0aGlzLnNhdmVUaGVtZURhdGEoKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZXNbbmFtZV07XHJcbiAgICBET00uYWRkU3R5bGUoRE9NLmVzY2FwZUlEKHRoZW1lLmlkKSwgdW5lc2NhcGUodGhlbWUuY3NzKSk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IGhhcyBiZWVuIGFwcGxpZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZW5hYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5lbmFibGVUaGVtZShuYW1lLCByZWxvYWQpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRpc2FibGVUaGVtZSA9IGZ1bmN0aW9uKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICB0aGVtZUNvb2tpZVtuYW1lXSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW25hbWVdO1xyXG4gICAgRE9NLnJlbW92ZVN0eWxlKERPTS5lc2NhcGVJRCh0aGVtZS5pZCkpO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBkaXNhYmxlZC5gKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24gKG5hbWUsIHJlbG9hZCA9IGZhbHNlKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGVUaGVtZSA9IGZ1bmN0aW9uKHRoZW1lKSB7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSk7XHJcbiAgICBlbHNlIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZSkge1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3RoZW1lczogW2Vycm9yXX0pO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke2ZpbGVuYW1lfSBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCBtYXkgbm90IGhhdmUgYmVlbiBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xyXG4gICAgICAgIHJldHVybiBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBjb25zdCB0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lKTtcclxuICAgIFV0aWxzLmxvZyhcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lLm5hbWV9IHYke3RoZW1lLnZlcnNpb259IHdhcyBsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1sb2FkZWRcIiwgdGhlbWUubmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudW5sb2FkVGhlbWUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGRlbGV0ZSBiZHRoZW1lc1t0aGVtZV07XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHVubG9hZGVkLiBJdCBtYXkgaGF2ZSBub3QgYmVlbiBsb2FkZWQgeWV0LmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gd2FzIHVubG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtdW5sb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICB0aGlzLnVubG9hZFRoZW1lKGJkcGx1Z2luLmZpbGVuYW1lKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkVGhlbWUgPSBhc3luYyBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybiB0aGlzLmxvYWRUaGVtZShmaWxlbmFtZU9yTmFtZSk7XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAodGhlbWVDb29raWVbdGhlbWVdKSB0aGlzLmRpc2FibGVUaGVtZSh0aGVtZSwgdHJ1ZSksIHRoaXMuZW5hYmxlVGhlbWUodGhlbWUsIHRydWUpO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHYke2JkdGhlbWVzW3RoZW1lXS52ZXJzaW9ufSB3YXMgcmVsb2FkZWQuYCk7XHJcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtcmVsb2FkZWRcIiwgdGhlbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnJlbG9hZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiB0aGlzLnJlbG9hZFRoZW1lKG5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVkaXQgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xyXG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlciwgYmRwbHVnaW4uZmlsZW5hbWUpO1xyXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKGAke2Z1bGxQYXRofWApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVwZGF0ZVRoZW1lTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IENvbnRlbnRNYW5hZ2VyLmxvYWROZXdDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgIGZvciAoY29uc3QgbmFtZSBvZiByZXN1bHRzLnJlbW92ZWQpIHRoaXMudW5sb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lRGF0YSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgY29uc3Qgc2F2ZWQgPSBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIpO1xyXG4gICAgaWYgKHNhdmVkKSB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGVtZUNvb2tpZSwgc2F2ZWQpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnNhdmVUaGVtZURhdGEgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwidGhlbWVzXCIsIHRoZW1lQ29va2llKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBUaGVtZU1vZHVsZSgpOyIsImltcG9ydCB7YmJkVmVyc2lvbiwgc2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVXRpbHMge1xyXG4gICAgLyoqIERvY3VtZW50L3dpbmRvdyB3aWR0aCAqL1xyXG4gICAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH1cclxuICAgIC8qKiBEb2N1bWVudC93aW5kb3cgaGVpZ2h0ICovXHJcbiAgICBzdGF0aWMgZ2V0IHNjcmVlbkhlaWdodCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsgfVxyXG5cclxuICAgIHN0YXRpYyBnZXQgV2luZG93Q29uZmlnRmlsZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fd2luZG93Q29uZmlnRmlsZSA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldEFsbFdpbmRvd1ByZWZlcmVuY2VzKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICAgICAgICBmcmFtZTogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpIHtcclxuICAgICAgICBpZiAoa2V5ID09PSBcInRyYW5zcGFyZW50XCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAoa2V5ID09PSBcImZyYW1lXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3RyaXBCT00oY29udGVudCkge1xyXG4gICAgICAgIGlmIChjb250ZW50LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xyXG4gICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5zbGljZSgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFRleHRBcmVhKCkge1xyXG4gICAgICAgIHJldHVybiBET00ucXVlcnkoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2hhbm5lbFRleHRBcmVhICYmIGUudGl0bGVXcmFwcGVyKVswXS5jaGFubmVsVGV4dEFyZWEuc3BsaXQoXCIgXCIpWzBdK1wiIHRleHRhcmVhXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpbnNlcnRUZXh0KHRleHRhcmVhLCB0ZXh0KSB7XHJcbiAgICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcclxuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IDA7XHJcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdGV4dGFyZWEudmFsdWUubGVuZ3RoO1xyXG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxvZyhtb2R1bGVOYW1lLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICMzYTcxYzE7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICMzYTcxYzE7XCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyB3YXJuKG1vZHVsZU5hbWUsIG1lc3NhZ2UpIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBlcnIobW9kdWxlTmFtZSwgbWVzc2FnZSwgZXJyb3IpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogcmVkOyBmb250LXdlaWdodDogNzAwO1wiLCBcImNvbG9yOiByZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiJWNFcnJvcjogXCIgKyBlcnJvci5tZXNzYWdlLCBcImNvbG9yOiByZWQ7XCIpO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yLnN0YWNrKTtcclxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcclxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9bLS9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCBcIlxcXFwkJlwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgdGVzdEpTT04oZGF0YSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzRW1wdHkob2JqKSB7XHJcbiAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiA9PSB1bmRlZmluZWQgfHwgb2JqID09IFwiXCIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHJldHVybiBvYmoubGVuZ3RoID09IDA7XHJcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XHJcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3VwcHJlc3NFcnJvcnMobWV0aG9kLCBtZXNzYWdlKSB7XHJcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHsgcmV0dXJuIG1ldGhvZCguLi5wYXJhbXMpO1x0fVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkgeyB0aGlzLmVycihcIlN1cHByZXNzZWRFcnJvclwiLCBcIkVycm9yIG9jY3VycmVkIGluIFwiICsgbWVzc2FnZSwgZSk7IH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3Qge2JlZm9yZSwgYWZ0ZXIsIGluc3RlYWQsIG9uY2UgPSBmYWxzZSwgc2lsZW50ID0gZmFsc2UsIGZvcmNlID0gZmFsc2V9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBkaXNwbGF5TmFtZSA9IG9wdGlvbnMuZGlzcGxheU5hbWUgfHwgd2hhdC5kaXNwbGF5TmFtZSB8fCB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lIHx8IHdoYXQubmFtZSB8fCB3aGF0LmNvbnN0cnVjdG9yLmRpc3BsYXlOYW1lIHx8IHdoYXQuY29uc3RydWN0b3IubmFtZTtcclxuICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXHJcbiAgICAgICAgaWYgKCF3aGF0W21ldGhvZE5hbWVdKSB7XHJcbiAgICAgICAgICAgIGlmIChmb3JjZSkgd2hhdFttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkge307XHJcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgb3JpZ01ldGhvZCA9IHdoYXRbbWV0aG9kTmFtZV07XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJ1bnBhdGNoXCIsIG1ldGhvZE5hbWUsIFwib2ZcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXSA9IG9yaWdNZXRob2Q7XHJcbiAgICAgICAgfTtcclxuICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzT2JqZWN0OiB0aGlzLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kQXJndW1lbnRzOiBhcmd1bWVudHMsXHJcbiAgICAgICAgICAgICAgICBjYW5jZWxQYXRjaDogY2FuY2VsLFxyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxNZXRob2Q6IG9yaWdNZXRob2QsXHJcbiAgICAgICAgICAgICAgICBjYWxsT3JpZ2luYWxNZXRob2Q6ICgpID0+IGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLm9yaWdpbmFsTWV0aG9kLmFwcGx5KGRhdGEudGhpc09iamVjdCwgZGF0YS5tZXRob2RBcmd1bWVudHMpXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGlmIChpbnN0ZWFkKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmV0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcclxuICAgICAgICAgICAgICAgIGlmICh0ZW1wUmV0ICE9PSB1bmRlZmluZWQpIGRhdGEucmV0dXJuVmFsdWUgPSB0ZW1wUmV0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKGJlZm9yZSkgVXRpbHMuc3VwcHJlc3NFcnJvcnMoYmVmb3JlLCBcImBiZWZvcmVgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgICAgICBkYXRhLmNhbGxPcmlnaW5hbE1ldGhvZCgpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhhZnRlciwgXCJgYWZ0ZXJgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKG9uY2UpIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24od2hhdFttZXRob2ROYW1lXSwgb3JpZ01ldGhvZCk7XHJcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xyXG4gICAgICAgIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTtcclxuICAgICAgICBpZiAoIXdoYXRbbWV0aG9kTmFtZV0uX19vcmlnaW5hbE1ldGhvZCkge1xyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xyXG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7cmV0dXJuIG9yaWdNZXRob2QudG9TdHJpbmcoKTt9O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcclxuICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChtdXRhdGlvbnMpID0+IHtcclxuICAgICAgICAgICAgZm9yIChsZXQgbSA9IDA7IG0gPCBtdXRhdGlvbnMubGVuZ3RoOyBtKyspIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcclxuICAgICAgICAgICAgICAgIGlmIChkaXJlY3RNYXRjaCB8fCBwYXJlbnRNYXRjaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXROZXN0ZWRQcm9wKG9iaiwgcGF0aCkge1xyXG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihvYmosIHByb3ApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG9iaiAmJiBvYmpbcHJvcF07XHJcbiAgICAgICAgfSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgc2hvd3MgYSB0b2FzdCBzaW1pbGFyIHRvIGFuZHJvaWQgdG93YXJkcyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnQgVGhlIHN0cmluZyB0byBzaG93IGluIHRoZSB0b2FzdC5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBPcHRpb25hbCBwYXJhbWV0ZXIuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50eXBlIENoYW5nZXMgdGhlIHR5cGUgb2YgdGhlIHRvYXN0IHN0eWxpc3RpY2FsbHkgYW5kIHNlbWFudGljYWxseS4gQ2hvaWNlczogXCJcIiwgXCJpbmZvXCIsIFwic3VjY2Vzc1wiLCBcImRhbmdlclwiL1wiZXJyb3JcIiwgXCJ3YXJuaW5nXCIvXCJ3YXJuXCIuIERlZmF1bHQ6IFwiXCJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0aW9ucy5pY29uIERldGVybWluZXMgd2hldGhlciB0aGUgaWNvbiBzaG91bGQgc2hvdyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlLiBBIHRvYXN0IHdpdGhvdXQgdHlwZSB3aWxsIGFsd2F5cyBoYXZlIG5vIGljb24uIERlZmF1bHQ6IHRydWVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgQWRqdXN0cyB0aGUgdGltZSAoaW4gbXMpIHRoZSB0b2FzdCBzaG91bGQgYmUgc2hvd24gZm9yIGJlZm9yZSBkaXNhcHBlYXJpbmcgYXV0b21hdGljYWxseS4gRGVmYXVsdDogMzAwMFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2hvd1RvYXN0KGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyICYmIGUuaGFzTm90aWNlKVswXS5zaWRlYmFyLnNwbGl0KFwiIFwiKVs5XStcIiArIGRpdlwiKSB8fCBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBtZW1iZXJsaXN0ID0gY29udGFpbmVyID8gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUubWVtYmVyc1dyYXApWzBdLm1lbWJlcnNXcmFwKSA6IG51bGw7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcImZvcm1cIikgOiBudWxsO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0ID0gY29udGFpbmVyID8gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgOiAzMTA7XHJcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gbWVtYmVybGlzdCA/IG1lbWJlcmxpc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCA6IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgPyByaWdodCAtIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IDogVXRpbHMuc2NyZWVuV2lkdGggLSBsZWZ0IC0gMjQwO1xyXG4gICAgICAgICAgICBjb25zdCBib3R0b20gPSBmb3JtID8gZm9ybS5vZmZzZXRIZWlnaHQgOiA4MDtcclxuICAgICAgICAgICAgY29uc3QgdG9hc3RXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdHNcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgbGVmdCArIFwicHhcIik7XHJcbiAgICAgICAgICAgIHRvYXN0V3JhcHBlci5zdHlsZS5zZXRQcm9wZXJ0eShcIndpZHRoXCIsIHdpZHRoICsgXCJweFwiKTtcclxuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLnN0eWxlLnNldFByb3BlcnR5KFwiYm90dG9tXCIsIGJvdHRvbSArIFwicHhcIik7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpLmFwcGVuZENoaWxkKHRvYXN0V3JhcHBlcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHt0eXBlID0gXCJcIiwgaWNvbiA9IHRydWUsIHRpbWVvdXQgPSAzMDAwfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3QgdG9hc3RFbGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImJkLXRvYXN0XCIpO1xyXG4gICAgICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XHJcbiAgICAgICAgaWYgKHR5cGUgJiYgaWNvbikgdG9hc3RFbGVtLmNsYXNzTGlzdC5hZGQoXCJpY29uXCIpO1xyXG4gICAgICAgIHRvYXN0RWxlbS5pbm5lclRleHQgPSBjb250ZW50O1xyXG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLmFwcGVuZENoaWxkKHRvYXN0RWxlbSk7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0b2FzdEVsZW0ucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmQtdG9hc3RzIC5iZC10b2FzdFwiKS5sZW5ndGgpIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgIH0sIHRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xyXG4gICAgICAgIGxldCBtb2RhbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1vZGFsICYmIGUuaW5uZXIgJiYgIWUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgaGVhZGVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuaGVhZGVyICYmIGUucmVzcG9uc2l2ZVdpZHRoTW9iaWxlICYmIGUuaGlkZU9uRnVsbHNjcmVlbilbMF1cclxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cclxuICAgICAgICBjb25zdCBtb2RhbCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtd3JhcHBlciB0aGVtZS1kYXJrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1iYWNrZHJvcCAke0JETW9kdWxlcy5nZXQoZSA9PiBlLmJhY2tkcm9wICYmIGUuYmFja2Ryb3BXaXRoTGF5ZXIpWzBdLmJhY2tkcm9wfVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ke3RpdGxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7Y29udGVudH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCI+T2theTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5iZC1iYWNrZHJvcFwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxyXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxyXG4gICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xyXG4gICAgICAgIGNvbnN0IGNsb3NpbmdMaXN0ZW5lcnMgPSBbXVxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGNsb3NlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBcclxuICAgICAgICAgICAgICAgICAgICBtb2RhbC5yZW1vdmUoKTsgXHJcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAzMDApO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBvbkNsb3NlOiAobGlzdGVuZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IHBsdWdpbkVycm9ycyA9IFtdLCB0aGVtZXM6IHRoZW1lRXJyb3JzID0gW119KSB7XHJcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMgfHwgIXRoZW1lRXJyb3JzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKCFwbHVnaW5FcnJvcnMubGVuZ3RoICYmICF0aGVtZUVycm9ycy5sZW5ndGgpIHJldHVybjtcclxuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGhlYWRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXHJcbiAgICAgICAgbGV0IGZvb3RlcjJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5mb2N1c0xvY2spWzBdXHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtYmFja2Ryb3AgJHtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iYWNrZHJvcCAmJiBlLmJhY2tkcm9wV2l0aExheWVyKVswXS5iYWNrZHJvcH1cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsIGJkLWNvbnRlbnQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgJHtoZWFkZXJNb2R1bGUuaGVhZGVyfVwiPjxkaXYgY2xhc3M9XCJ0aXRsZVwiPkNvbnRlbnQgRXJyb3JzPC9kaXY+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhciBUT1BcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFiLWJhci1pdGVtXCI+UGx1Z2luczwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5UaGVtZXM8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPk5hbWU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj5NZXNzYWdlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPkVycm9yPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXItd3JhcCBmYWRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cclxuICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXIgJHtoZWFkZXJNb2R1bGUuZm9vdGVyfSAke2Zvb3RlcjJNb2R1bGUuZm9vdGVyfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XHJcbiAgICBcclxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVRhYihlcnJvcnMpIHtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCJlcnJvcnNcIj5gKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgZXJyb3JzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbmFtZVwiPiR7ZXJyLm5hbWUgPyBlcnIubmFtZSA6IGVyci5maWxlfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1tZXNzYWdlXCI+JHtlcnIubWVzc2FnZX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj48YSBjbGFzcz1cImVycm9yLWxpbmtcIiBocmVmPVwiXCI+JHtlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IFwiXCJ9PC9hPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IucXVlcnlTZWxlY3RvckFsbChcImFcIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgRXJyb3IgZGV0YWlscyBmb3IgJHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9LmAsIGVyci5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgY29uc3QgdGFicyA9IFtnZW5lcmF0ZVRhYihwbHVnaW5FcnJvcnMpLCBnZW5lcmF0ZVRhYih0aGVtZUVycm9ycyldO1xyXG4gICAgXHJcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIudGFiLWJhci1pdGVtLnNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIERPTS5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgXCJzZWxlY3RlZFwiKTtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKGUudGFyZ2V0LCBcInNlbGVjdGVkXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBzY3JvbGxlciA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuc2Nyb2xsZXJcIik7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgIHNjcm9sbGVyLmFwcGVuZCh0YWJzW0RPTS5pbmRleChlLnRhcmdldCldKTtcclxuICAgICAgICB9KSk7XHJcbiAgICBcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmZvb3RlciBidXR0b25cIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLmJkLWJhY2tkcm9wXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbW9kYWwucmVtb3ZlKCk7IH0sIDMwMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xyXG4gICAgICAgIGlmIChwbHVnaW5FcnJvcnMubGVuZ3RoKSBtb2RhbC5xdWVyeVNlbGVjdG9yKFwiLnRhYi1iYXItaXRlbVwiKS5jbGljaygpO1xyXG4gICAgICAgIGVsc2UgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIilbMV0uY2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2hvd0NoYW5nZWxvZ01vZGFsKG9wdGlvbnMgPSB7fSkge1xyXG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xyXG4gICAgICAgIGNvbnN0IENoYW5nZWxvZ0NsYXNzZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImZpeGVkXCIsIFwiaW1wcm92ZWRcIik7XHJcbiAgICAgICAgY29uc3QgVGV4dEVsZW1lbnQgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRleHRcIik7XHJcbiAgICAgICAgY29uc3QgRmxleENoaWxkID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJDaGlsZFwiKTtcclxuICAgICAgICBjb25zdCBUaXRsZXMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIlRhZ3NcIiwgXCJkZWZhdWx0XCIpO1xyXG4gICAgICAgIGNvbnN0IENoYW5nZWxvZyA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5zZWxlY3RhYmxlID09IGZhbHNlKTtcclxuICAgICAgICBjb25zdCBNYXJrZG93blBhcnNlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZGVmYXVsdFJ1bGVzXCIsIFwicGFyc2VcIik7XHJcbiAgICAgICAgaWYgKCFDaGFuZ2Vsb2cgfHwgIU1vZGFsU3RhY2sgfHwgIUNoYW5nZWxvZ0NsYXNzZXMgfHwgIVRleHRFbGVtZW50IHx8ICFGbGV4Q2hpbGQgfHwgIVRpdGxlcyB8fCAhTWFya2Rvd25QYXJzZXIpIHJldHVybjtcclxuICAgIFxyXG4gICAgICAgIGNvbnN0IHtcclxuICAgICAgICAgICAgaW1hZ2UgPSBcImh0dHBzOi8vcmVwb3NpdG9yeS1pbWFnZXMuZ2l0aHVidXNlcmNvbnRlbnQuY29tLzEwNTQ3MzUzNy85NTdiNTQ4MC03YzI2LTExZTktODQwMS01MGZhODIwY2JhZTVcIiwgXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gXCJcIiwgXHJcbiAgICAgICAgICAgIGNoYW5nZXMgPSBbXSwgXHJcbiAgICAgICAgICAgIHRpdGxlID0gXCJCYW5kYWdlZEJEXCIsIFxyXG4gICAgICAgICAgICBzdWJ0aXRsZSA9IGB2JHtiYmRWZXJzaW9ufWAsIFxyXG4gICAgICAgICAgICBmb290ZXJcclxuICAgICAgICB9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBjZSA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudDtcclxuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dJdGVtcyA9IFtjZShcImltZ1wiLCB7c3JjOiBpbWFnZX0pXTtcclxuICAgICAgICBpZiAoZGVzY3JpcHRpb24pIGNoYW5nZWxvZ0l0ZW1zLnB1c2goY2UoXCJwXCIsIG51bGwsIE1hcmtkb3duUGFyc2VyLnBhcnNlKGRlc2NyaXB0aW9uKSkpO1xyXG4gICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbmdlcy5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNoYW5nZXNbY107XHJcbiAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBDaGFuZ2Vsb2dDbGFzc2VzW2VudHJ5LnR5cGVdID8gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA6IENoYW5nZWxvZ0NsYXNzZXMuYWRkZWQ7XHJcbiAgICAgICAgICAgIGNvbnN0IG1hcmdpbiA9IGMgPT0gMCA/IENoYW5nZWxvZ0NsYXNzZXMubWFyZ2luVG9wIDogXCJcIjtcclxuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcImgxXCIsIHtjbGFzc05hbWU6IGAke3R5cGV9ICR7bWFyZ2lufWAsfSwgZW50cnkudGl0bGUpKTtcclxuICAgICAgICAgICAgY29uc3QgbGlzdCA9IGNlKFwidWxcIiwgbnVsbCwgZW50cnkuaXRlbXMubWFwKGkgPT4gY2UoXCJsaVwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShpKSkpKTtcclxuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChsaXN0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVuZGVySGVhZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LFxyXG4gICAgICAgICAgICAgICAgY2UoVGl0bGVzLmRlZmF1bHQsIHt0YWc6IFRpdGxlcy5UYWdzLkg0fSwgdGl0bGUpLFxyXG4gICAgICAgICAgICAgICAgY2UoVGV4dEVsZW1lbnQse3NpemU6IFRleHRFbGVtZW50LlNpemVzLlNNQUxMLCBjb2xvcjogVGV4dEVsZW1lbnQuQ29sb3JzLlNUQU5EQVJELCBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuZGF0ZX0sIHN1YnRpdGxlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcbiAgICBcclxuICAgICAgICBjb25zdCByZW5kZXJGb290ZXIgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgICAgICAgICBjb25zdCBBbmNob3JDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyXCIpIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O1xyXG4gICAgICAgICAgICBjb25zdCBqb2luU3VwcG9ydFNlcnZlciA9IChjbGljaykgPT4ge1xyXG4gICAgICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIGNsaWNrLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgTW9kYWxTdGFjay5wb3AoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuam9pbkJEMigpO1xyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICBjb25zdCBzdXBwb3J0TGluayA9IEFuY2hvciA/IGNlKEFuY2hvciwge29uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIikgOiBjZShcImFcIiwge2NsYXNzTmFtZTogYCR7QW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWAsIG9uQ2xpY2s6IGpvaW5TdXBwb3J0U2VydmVyfSwgXCJKb2luIG91ciBEaXNjb3JkIFNlcnZlci5cIik7XHJcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGb290ZXIgPSBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sIGZvb3RlciA/IGZvb3RlciA6IGRlZmF1bHRGb290ZXIpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJldHVybiBNb2RhbFN0YWNrLnB1c2goZnVuY3Rpb24ocHJvcHMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGNlKENoYW5nZWxvZywgT2JqZWN0LmFzc2lnbih7XHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuY29udGFpbmVyLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIG9uU2Nyb2xsOiBfID0+IF8sXHJcbiAgICAgICAgICAgICAgICBvbkNsb3NlOiBfID0+IF8sXHJcbiAgICAgICAgICAgICAgICByZW5kZXJIZWFkZXI6IHJlbmRlckhlYWRlcixcclxuICAgICAgICAgICAgICAgIHJlbmRlckZvb3RlcjogcmVuZGVyRm9vdGVyLFxyXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoYW5nZWxvZ0l0ZW1zXHJcbiAgICAgICAgICAgIH0sIHByb3BzKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xSZWFjdEVsZW1lbnR8QXJyYXk8c3RyaW5nfFJlYWN0RWxlbWVudD4pfSBjaGlsZHJlbiAtIGEgc2luZ2xlIG9yIG1peGVkIGFycmF5IG9mIHJlYWN0IGVsZW1lbnRzIGFuZCBzdHJpbmdzLiBFdmVyeSBzdHJpbmcgaXMgd3JhcHBlZCBpbiBEaXNjb3JkJ3MgYE1hcmtkb3duYCBjb21wb25lbnQgc28gc3RyaW5ncyB3aWxsIHNob3cgYW5kIHJlbmRlciBwcm9wZXJseS5cclxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY29uZmlybVRleHQ9T2theV0gLSB0ZXh0IGZvciB0aGUgY29uZmlybWF0aW9uL3N1Ym1pdCBidXR0b25cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25DYW5jZWw9Tk9PUF0gLSBjYWxsYmFjayB0byBvY2N1ciB3aGVuIGNsaWNraW5nIHRoZSBjYW5jZWwgYnV0dG9uXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgTW9kYWxTdGFjayA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwicHVzaFwiLCBcInVwZGF0ZVwiLCBcInBvcFwiLCBcInBvcFdpdGhLZXlcIik7XHJcbiAgICAgICAgY29uc3QgTWFya2Rvd24gPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIk1hcmtkb3duXCIpO1xyXG4gICAgICAgIGNvbnN0IENvbmZpcm1hdGlvbk1vZGFsID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0ua2V5ICYmIG0ua2V5KCkgPT0gXCJjb25maXJtLW1vZGFsXCIpO1xyXG4gICAgICAgIGlmICghTW9kYWxTdGFjayB8fCAhQ29uZmlybWF0aW9uTW9kYWwgfHwgIU1hcmtkb3duKSByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG5cclxuICAgICAgICBjb25zdCBlbXB0eUZ1bmN0aW9uID0gKCkgPT4ge307XHJcbiAgICAgICAgY29uc3Qge29uQ29uZmlybSA9IGVtcHR5RnVuY3Rpb24sIG9uQ2FuY2VsID0gZW1wdHlGdW5jdGlvbiwgY29uZmlybVRleHQgPSBcIk9rYXlcIiwgY2FuY2VsVGV4dCA9IFwiQ2FuY2VsXCIsIGRhbmdlciA9IGZhbHNlLCBrZXkgPSB1bmRlZmluZWR9ID0gb3B0aW9ucztcclxuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250ZW50ID0gW2NvbnRlbnRdO1xyXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50Lm1hcChjID0+IHR5cGVvZihjKSA9PT0gXCJzdHJpbmdcIiA/IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChNYXJrZG93biwgbnVsbCwgYykgOiBjKTtcclxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKENvbmZpcm1hdGlvbk1vZGFsLCB7XHJcbiAgICAgICAgICAgIGhlYWRlcjogdGl0bGUsXHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBjb250ZW50LFxyXG4gICAgICAgICAgICByZWQ6IGRhbmdlcixcclxuICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxyXG4gICAgICAgICAgICBjYW5jZWxUZXh0OiBjYW5jZWxUZXh0LFxyXG4gICAgICAgICAgICBvbkNvbmZpcm06IG9uQ29uZmlybSxcclxuICAgICAgICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsXHJcbiAgICAgICAgfSwga2V5KTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgcmVtb3ZlRGEoY2xhc3NOYW1lKXtcclxuICAgICAgICBpZighY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcclxuICAgICAgICByZXR1cm4gY2xhc3NOYW1lLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhZS5zdGFydHNXaXRoKFwiZGEtXCIpKS5qb2luKFwiIFwiKVxyXG4gICAgfVxyXG59XHJcblxyXG5VdGlscy5zaG93VG9hc3QgPSBVdGlscy5zdXBwcmVzc0Vycm9ycyhVdGlscy5zaG93VG9hc3QsIFwiQ291bGQgbm90IHNob3cgdG9hc3QuXCIpO1xyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLlV0aWxzID0gVXRpbHMiLCJpbXBvcnQge3NldHRpbmdzfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMiB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3JEZXRhY2hlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuV2VicGFja01vZHVsZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG4gICAgICAgICAgICBkZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUHJvdGVjdCA9IHRoZU1vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLnJlbW92ZSAmJiB0aGVNb2R1bGUuc2V0ICYmIHRoZU1vZHVsZS5jbGVhciAmJiB0aGVNb2R1bGUuZ2V0ICYmICF0aGVNb2R1bGUuc29ydCkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhlTW9kdWxlLmdldFRva2VuIHx8IHRoZU1vZHVsZS5nZXRFbWFpbCB8fCB0aGVNb2R1bGUuc2hvd1Rva2VuKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHByb3RlY3QgPSB0aGVNb2R1bGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoZU1vZHVsZS5yZW1vdmUgJiYgdGhlTW9kdWxlLnNldCAmJiB0aGVNb2R1bGUuY2xlYXIgJiYgdGhlTW9kdWxlLmdldCAmJiAhdGhlTW9kdWxlLnNvcnQpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGVNb2R1bGUuZ2V0VG9rZW4gJiYgIXRoZU1vZHVsZS5nZXRFbWFpbCAmJiAhdGhlTW9kdWxlLnNob3dUb2tlbikgcmV0dXJuIHRoZU1vZHVsZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRoZU1vZHVsZSwge1xyXG4gICAgICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImdldFRva2VuXCIgfHwgcHJvcCA9PT0gXCJnZXRFbWFpbFwiIHx8IHByb3AgPT09IFwic2hvd1Rva2VuXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgZnVuYykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldFRva2VuXCIpIHJldHVybiAoKSA9PiBcIm1mYS5YQ25iS3pvMENMSXFkSnpCbkwwRDhQZkRydXFrSk5IandIWHRyMzlVVTNGOGhIeDQzam9qSVN5aTVqZGpPNTJlOV9lOU1qbWFmWkZGcGMtc2VPTWFcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRFbWFpbFwiKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJzaG93VG9rZW5cIikgcmV0dXJuICgpID0+IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChmdW5jID09IFwiX19wcm90b19fXCIpIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ialtmdW5jXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBwcm94eTtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBwcm90ZWN0KG0uZGVmYXVsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBwcm90ZWN0KG0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0uZGVmYXVsdCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVzO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5VW5pcXVlUHJvcGVydGllcyA9IChwcm9wTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IHByb3BOYW1lcy5ldmVyeShwcm9wID0+IG1vZHVsZVtwcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVByb3RvdHlwZXMgPSAocHJvdG9OYW1lcykgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLnByb3RvdHlwZSAmJiBwcm90b05hbWVzLmV2ZXJ5KHByb3RvUHJvcCA9PiBtb2R1bGUucHJvdG90eXBlW3Byb3RvUHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlEaXNwbGF5TmFtZSA9IChkaXNwbGF5TmFtZSkgPT4gZmluZChtb2R1bGUgPT4gbW9kdWxlLmRpc3BsYXlOYW1lID09PSBkaXNwbGF5TmFtZSk7XHJcblxyXG4gICAgICAgICAgICByZXR1cm4ge2ZpbmQsIGZpbmRBbGwsIGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuICAgICAgICB9KSgpO1xyXG5cclxuICAgICAgICB0aGlzLmludGVybmFsID0ge1xyXG4gICAgICAgICAgICByZWFjdDogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIkNvbXBvbmVudFwiLCBcIlB1cmVDb21wb25lbnRcIiwgXCJDaGlsZHJlblwiLCBcImNyZWF0ZUVsZW1lbnRcIiwgXCJjbG9uZUVsZW1lbnRcIl0pLFxyXG4gICAgICAgICAgICByZWFjdERvbTogdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImZpbmRET01Ob2RlXCJdKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5nZXRJbnRlcm5hbEluc3RhbmNlID0gZSA9PiBlW09iamVjdC5rZXlzKGUpLmZpbmQoayA9PiBrLnN0YXJ0c1dpdGgoXCJfX3JlYWN0SW50ZXJuYWxJbnN0YW5jZVwiKSldO1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGpvaW5CRDEoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCIwVG1mbzVaYk9SQ1JxYkFkXCIpO31cclxuICAgIGxlYXZlQkQxKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI4NjAwNDc0NDk2NjkxNDA0OFwiKTt9XHJcblxyXG4gICAgam9pbkJEMigpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjJIU2NtOGpcIik7fVxyXG4gICAgbGVhdmVCRDIoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjI4MDgwNjQ3MjkyODE5ODY1NlwiKTt9XHJcblxyXG4gICAgam9pbkxDKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiY3hmQTJkVFwiKTt9XHJcbiAgICBsZWF2ZUxDKCkge3RoaXMuR3VpbGRBY3Rpb25zLmxlYXZlR3VpbGQoXCI3MDU5MDgzNTAyMTg2NjYxMTdcIik7fVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdH1cclxuICAgICAqL1xyXG4gICAgZ2V0IFJlYWN0KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCByZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3QtZG9tXCIpfVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3REb20oKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3REb207fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0LkNvbXBvbmVudH1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0Q29tcG9uZW50KCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0LkNvbXBvbmVudDt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuXHJcbiAgICBnZXQgYW5jaG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFuY2hvclVuZGVybGluZU9uSG92ZXJcIl0pIHx8IHthbmNob3I6IFwiYW5jaG9yLTNaLThCYlwiLCBhbmNob3JVbmRlcmxpbmVPbkhvdmVyOiBcImFuY2hvclVuZGVybGluZU9uSG92ZXItMkVTSFFCXCJ9O31cclxuICAgIGdldCBzbGF0ZUVkaXRvckNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzbGF0ZVRleHRBcmVhXCJdKTt9XHJcbiAgICBnZXQgbWVzc2FnZUNsYXNzZXMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJtZXNzYWdlXCIsIFwiY29udGFpbmVyQ296eVwiXSk7fVxyXG4gICAgZ2V0IGd1aWxkQ2xhc3NlcygpIHtcclxuXHRcdGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS53cmFwcGVyICYmIGUudW5yZWFkTWVudGlvbnNCYXIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmd1aWxkc0Vycm9yICYmIGUuc2VsZWN0ZWQpWzBdXHJcbiAgICAgICAgY29uc3QgcGlsbCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmJsb2JDb250YWluZXIpWzBdXHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGd1aWxkc1dyYXBwZXIsIGd1aWxkcywgcGlsbCk7XHJcblx0fVxyXG5cclxuICAgIGdldCBNZXNzYWdlQ29udGVudENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0UHJvcHMgJiYgbS5kZWZhdWx0UHJvcHMuaGFzT3duUHJvcGVydHkoXCJkaXNhYmxlQnV0dG9uc1wiKSk7fVxyXG4gICAgZ2V0IE1lc3NhZ2VDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LmRpc3BsYXlOYW1lID09IFwiTWVzc2FnZVwiKTt9XHJcbiAgICBnZXQgVGltZUZvcm1hdHRlcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImRhdGVGb3JtYXRcIl0pO31cclxuICAgIGdldCBUb29sdGlwV3JhcHBlcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7fVxyXG4gICAgZ2V0IE5hdGl2ZU1vZHVsZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNldEJhZGdlXCJdKTt9XHJcbiAgICBnZXQgSW52aXRlQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7fVxyXG4gICAgZ2V0IEd1aWxkQWN0aW9ucygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImxlYXZlR3VpbGRcIl0pO31cclxuICAgIGdldCBUb29sdGlwcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5oaWRlICYmIG0uc2hvdyAmJiAhbS5zZWFyY2ggJiYgIW0uc3VibWl0ICYmICFtLnNlYXJjaCAmJiAhbS5hY3RpdmF0ZVJhZ2luZ0RlbW9uICYmICFtLmRpc21pc3MpO31cclxuICAgIGdldCBLZXlHZW5lcmF0b3IoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZChtID0+IG0udG9TdHJpbmcgJiYgL1wiYmluYXJ5XCIvLnRlc3QobS50b1N0cmluZygpKSk7fVxyXG4gICAgZ2V0IExheWVyU3RhY2soKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJwb3BMYXllclwiXSk7fVxyXG4gICAgZ2V0IFVzZXJTdG9yZSgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEN1cnJlbnRVc2VyXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbFN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q2hhbm5lbFwiXSk7fVxyXG4gICAgZ2V0IENoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wib3BlblByaXZhdGVDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgUHJpdmF0ZUNoYW5uZWxBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2VsZWN0UHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuXHJcbiAgICBvcGVuRE0odXNlcklkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZklkID0gdGhpcy5Vc2VyU3RvcmUuZ2V0Q3VycmVudFVzZXIoKS5pZDtcclxuICAgICAgICBpZiAoc2VsZklkID09IHVzZXJJZCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHByaXZhdGVDaGFubmVsSWQgPSB0aGlzLkNoYW5uZWxTdG9yZS5nZXRETUZyb21Vc2VySWQodXNlcklkKTtcclxuICAgICAgICBpZiAocHJpdmF0ZUNoYW5uZWxJZCkgcmV0dXJuIHRoaXMuUHJpdmF0ZUNoYW5uZWxBY3Rpb25zLnNlbGVjdFByaXZhdGVDaGFubmVsKHByaXZhdGVDaGFubmVsSWQpO1xyXG4gICAgICAgIHRoaXMuQ2hhbm5lbEFjdGlvbnMub3BlblByaXZhdGVDaGFubmVsKHNlbGZJZCwgdXNlcklkKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZVNldHRpbmdzKGNhdCkge1xyXG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXR0aW5ncykucmVkdWNlKChhcnIsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nID0gc2V0dGluZ3Nba2V5XTtcclxuICAgICAgICAgICAgaWYgKHNldHRpbmcuY2F0ID09PSBjYXQgJiYgc2V0dGluZy5pbXBsZW1lbnRlZCAmJiAhc2V0dGluZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgIHNldHRpbmcudGV4dCA9IGtleTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNldHRpbmcpO1xyXG4gICAgICAgICAgICB9IHJldHVybiBhcnI7XHJcbiAgICAgICAgfSwgW10pO1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5jb25zdCBzdHlsZSA9IGBcclxuICAgIC5jb250YWluZXItMlJsMDF1IHtcclxuICAgICAgICBkaXNwbGF5OiBub25lIWltcG9ydGFudDtcclxuICAgIH1cclxuXHJcbiAgICAuY2hhdC0zYlJ4eHUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5zaWRlYmFyLTJLOHBGaCB7XHJcbiAgICAgICAgZmxleC1ncm93OiAxIWltcG9ydGFudDtcclxuICAgIH1cclxuYDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWb2ljZU1vZGUge1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiVm9pY2VNb2RlXCIsIHN0eWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcIlZvaWNlTW9kZVwiKTtcclxuICAgIH1cclxufTsiLCJjb25zdCByZXEgPSB3ZWJwYWNrSnNvbnAucHVzaChbW10sIHtfX2V4dHJhX2lkX186IChtb2R1bGUsIGV4cG9ydHMsIHJlcSkgPT4gbW9kdWxlLmV4cG9ydHMgPSByZXF9LCBbW1wiX19leHRyYV9pZF9fXCJdXV0pO1xyXG5kZWxldGUgcmVxLm0uX19leHRyYV9pZF9fO1xyXG5kZWxldGUgcmVxLmMuX19leHRyYV9pZF9fO1xyXG5jb25zdCBmaW5kID0gKGZpbHRlcikgPT4ge1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSByZXR1cm4gbS5kZWZhdWx0O1xyXG4gICAgICAgICAgICBpZiAobSAmJiBmaWx0ZXIobSkpXHRyZXR1cm4gbTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLndhcm4oXCJDYW5ub3QgZmluZCBsb2FkZWQgbW9kdWxlIGluIGNhY2hlXCIpO1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbn07XHJcblxyXG5jb25zdCBmaW5kQWxsID0gKGZpbHRlcikgPT4ge1xyXG4gICAgY29uc3QgbW9kdWxlcyA9IFtdO1xyXG4gICAgZm9yIChjb25zdCBpIGluIHJlcS5jKSB7XHJcbiAgICAgICAgaWYgKHJlcS5jLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG0gPSByZXEuY1tpXS5leHBvcnRzO1xyXG4gICAgICAgICAgICBpZiAobSAmJiBtLl9fZXNNb2R1bGUgJiYgbS5kZWZhdWx0ICYmIGZpbHRlcihtLmRlZmF1bHQpKSBtb2R1bGVzLnB1c2gobS5kZWZhdWx0KTtcclxuICAgICAgICAgICAgZWxzZSBpZiAobSAmJiBmaWx0ZXIobSkpIG1vZHVsZXMucHVzaChtKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbW9kdWxlcztcclxufTtcclxuXHJcbmNvbnN0IGZpbmRCeVByb3BzID0gKC4uLnByb3BOYW1lcykgPT4gZmluZChtb2R1bGUgPT4gcHJvcE5hbWVzLmV2ZXJ5KHByb3AgPT4gbW9kdWxlW3Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5UHJvdG90eXBlcyA9ICguLi5wcm90b05hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUucHJvdG90eXBlICYmIHByb3RvTmFtZXMuZXZlcnkocHJvdG9Qcm9wID0+IG1vZHVsZS5wcm90b3R5cGVbcHJvdG9Qcm9wXSAhPT0gdW5kZWZpbmVkKSk7XHJcbmNvbnN0IGZpbmRCeURpc3BsYXlOYW1lID0gKGRpc3BsYXlOYW1lKSA9PiBmaW5kKG1vZHVsZSA9PiBtb2R1bGUuZGlzcGxheU5hbWUgPT09IGRpc3BsYXlOYW1lKTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlQcm9wcywgZmluZEJ5UHJvdG90eXBlcywgZmluZEJ5RGlzcGxheU5hbWV9OyIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCJcclxuXHJcbmxldCBwcm9maWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5vcGVuICYmIGUuZGVmYXVsdC5mZXRjaE11dHVhbEZyaWVuZHMpWzBdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRVc2VyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcblxyXG4gICAgICAgIGRlbGV0ZSBwcm9wcy5ocmVmLnRhcmdldFxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhwcm9wcylcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHByb3BzLkFuY2hvciBocmVmPXtcIi91c2Vycy9cIitwcm9wcy51c2VyLmlkfSB7Li4ucHJvcHMuaHJlZn0gb25DbGljaz17KGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICBpZighcHJvZmlsTW9kdWxlKXByb2ZpbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lm9wZW4gJiYgZS5kZWZhdWx0LmZldGNoTXV0dWFsRnJpZW5kcylbMF1cclxuICAgICAgICAgICAgICAgIHByb2ZpbE1vZHVsZS5kZWZhdWx0Lm9wZW4ocHJvcHMudXNlci5pZClcclxuICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMzEuMyAyOS41XCIgey4uLnByb3BzLnN2Z30gaGVpZ2h0PVwiMTAwJVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOCAxczEyIDguMiA3LjQgMTkuN1MxNi42IDI5IDIwIDI1LjZzLTQtNS42LTguNy0xMEwyMi44IDFcIiBmaWxsPVwicmdiYSgyMjcsNiwxOSwuNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuMSAxMi4zYy0yLjUgMy4yLTYuMSA0LjgtOC45IDQuM0wzLjYgMjguOGMtLjcuOS0xLjkgMS0yLjguMy0uOS0uNy0xLTEuOS0uNC0yLjhMMTAgMTQuMWMtMS4zLTIuNS0uNi02LjQgMi05LjcgMy4yLTQgOC01LjUgMTAuOC0zLjRzMi40IDcuMi0uNyAxMS4zelwiIGZpbGw9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICA8L3Byb3BzLkFuY2hvcj5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQnVnSHVudGVyQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAzMS4zIDI5LjVcIiB7Li4ucHJvcHMuc3ZnfSBoZWlnaHQ9XCIxMDAlXCI+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTIyLjggMXMxMiA4LjIgNy40IDE5LjdTMTYuNiAyOSAyMCAyNS42cy00LTUuNi04LjctMTBMMjIuOCAxXCIgZmlsbD1cInJnYmEoMjI3LDYsMTksLjYpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuMSAxMi4zYy0yLjUgMy4yLTYuMSA0LjgtOC45IDQuM0wzLjYgMjguOGMtLjcuOS0xLjkgMS0yLjguMy0uOS0uNy0xLTEuOS0uNC0yLjhMMTAgMTQuMWMtMS4zLTIuNS0uNi02LjQgMi05LjcgMy4yLTQgOC01LjUgMTAuOC0zLjRzMi40IDcuMi0uNyAxMS4zelwiIGZpbGw9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfSBcclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIExpZ2h0Y29yZExvZ28gZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLnByb3BzXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDE2OCAxNjguNjlcIiB7Li4ucHJvcHN9IGhlaWdodD1cIjEwMCVcIiB3aWR0aD17cHJvcHMuc2l6ZX0+XHJcbiAgICAgICAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2FcIiB4MT17NjYuN30geTE9ey00ODcuN30geDI9ezY2Ljd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExNFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2JcIiB4MT17MTAxLjd9IHkxPXstNDg3Ljd9IHgyPXsxMDEuN30geTI9ey01MDguNzN9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTIwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD1cInByZWZpeF9fY1wiIHgxPXs4NH0geTE9ey00MDh9IHgyPXs4NH0geTI9ey01NzYuNjl9IGdyYWRpZW50VHJhbnNmb3JtPVwibWF0cml4KDEgMCAwIC0xIDAgLTQwOClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXswfSBzdG9wQ29sb3I9XCIjZTMwNjEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PXsxfSBzdG9wQ29sb3I9XCIjNzMxYTEzXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PlxyXG4gICAgICAgICAgICAgICAgPC9kZWZzPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiNmZmZcIiBkPVwiTTE0LjkgMzUuM2gxMzkuMlYxMzNIMTQuOXpcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk02Ni43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2EpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTAxLjcgNzkuN2MtNS40IDAtOS44IDQuNy05LjggMTAuNXM0LjQgMTAuNSA5LjggMTAuNSA5LjgtNC43IDkuOC0xMC41LTQuNC0xMC41LTkuOC0xMC41elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDB2MTY4bDE2OCAuNjlWMHptMTExLjMgMTI0LjFzLTMuNC00LjEtNi4zLTcuN2MxMi42LTMuNSAxNy40LTExLjMgMTcuNC0xMS4zYTUyLjUyIDUyLjUyIDAgMDEtMTEuMSA1LjYgNjguNjMgNjguNjMgMCAwMS0zOC45IDQgNzAuMTIgNzAuMTIgMCAwMS0xNC4xLTQuMSA0OC44OCA0OC44OCAwIDAxLTcuMS0zLjNjLS4zLS4yLS42LS4zLS45LS41YS43Ni43NiAwIDAwLS40LS4yYy0xLjctMS0yLjYtMS42LTIuNi0xLjZzNC42IDcuNiAxNi44IDExLjJjLTIuOSAzLjYtNi40IDcuOS02LjQgNy45LTIxLjItLjYtMjkuMy0xNC41LTI5LjMtMTQuNSAwLTMwLjYgMTMuOC01NS40IDEzLjgtNTUuNCAxMy44LTEwLjMgMjYuOS0xMCAyNi45LTEwbDEgMS4xQzUyLjggNTAuMyA0NSA1Ny45IDQ1IDU3LjlhNTYuMiA1Ni4yIDAgMDE1LjctMi43IDcyLjE5IDcyLjE5IDAgMDEyMS44LTYgOC43NSA4Ljc1IDAgMDExLjYtLjIgODkuMSA4OS4xIDAgMDExOS40LS4yIDc4LjQ1IDc4LjQ1IDAgMDEyOC45IDkuMXMtNy41LTcuMi0yMy45LTEyLjFsMS4zLTEuNXMxMy4xLS4zIDI2LjkgMTBjMCAwIDEzLjggMjQuOCAxMy44IDU1LjQuMS0uMS04IDEzLjgtMjkuMiAxNC40elwiIGZpbGw9XCJ1cmwoI3ByZWZpeF9fYylcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgVjJDX1NldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5cclxuLyoqXHJcbiAqIEB0eXBlIHt0eXBlb2YgaW1wb3J0KFwicmVhY3RcIil9XHJcbiAqL1xyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5sZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbmxldCBtYXJnaW5Nb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXVxyXG5sZXQgY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG5sZXQgc2l6ZU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF1cclxubGV0IHNjcm9sbGJhck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXVxyXG5jb25zdCBHdWlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcylbMF0uZGVmYXVsdFxyXG5jb25zdCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRSZWxhdGlvbnNoaXBzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHNlc3Npb25Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRTZXNzaW9ucylbMF0uZGVmYXVsdFxyXG5jb25zdCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19BY2NvdW50SW5mb3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGlmKCFjb250ZW50TW9kdWxlKWNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIGlmKCFtYXJnaW5Nb2R1bGUyKW1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbiAgICAgICAgaWYoIWNvbG9yTW9kdWxlKWNvbG9yTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF1cclxuICAgICAgICBpZighc2l6ZU1vZHVsZSlzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn1cclxuICAgICAgICAgICAgc3R5bGU9e3twYWRkaW5nOiBcIjYwcHggNDBweCAwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJBY2NvdW50IEluZm9zXCIvPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlXHJcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRQcm9maWxlVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzXHJcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTdGF0aXN0aWNzKCl9IGxhbmd1YWdlPVwiZGlmZlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIFNlc3Npb25zXHJcbiAgICAgICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTZXNzaW9uVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXS5tYXJnaW5Cb3R0b20yMH0+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNlc3Npb25WYWx1ZSgpe1xyXG4gICAgICAgIGNvbnN0IHNlc3Npb25zUmF3ID0gc2Vzc2lvbk1vZHVsZS5nZXRTZXNzaW9ucygpXHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnMgPSBPYmplY3Qua2V5cyhzZXNzaW9uc1JhdykuZmlsdGVyKGUgPT4gZSAhPT0gXCJhbGxcIikubWFwKGUgPT4gc2Vzc2lvbnNSYXdbZV0pXHJcblxyXG4gICAgICAgIGlmKHNlc3Npb25zLmxlbmd0aCA9PT0gMClyZXR1cm4gXCItIE5vIHNlc3Npb24gZGV0ZWN0ZWQuIFBsZWFzZSB0cnkgaW4gYSBmZXcgc2Vjb25kc1wiXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIHNlc3Npb25zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGArIGlkOiAke2Uuc2Vzc2lvbklkfVxyXG4rIG9zOiAke2UuY2xpZW50SW5mby5vc1swXS50b1VwcGVyQ2FzZSgpK2UuY2xpZW50SW5mby5vcy5zbGljZSgxKX1cclxuKyBjbGllbnQ6ICR7ZS5jbGllbnRJbmZvLmNsaWVudH1cclxuKyBzdGF0dXM6ICR7ZS5zdGF0dXN9XHJcbisgYWN0aXZlOiAke2UuYWN0aXZlID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuKyBBY3Rpdml0aWVzOiAke2UuYWN0aXZpdGllcy5sZW5ndGh9YFxyXG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIitcIi1cIi5yZXBlYXQoMzgpK1wiXFxuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZmlsZVZhbHVlKCl7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtEYXRlfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHVzZXIuY3JlYXRlZEF0XHJcblxyXG4gICAgICAgIHJldHVybiBgKyBVc2VybmFtZTogJHt1c2VyLnVzZXJuYW1lfVxyXG4rIERpc2NyaW1pbmF0b3I6ICR7dXNlci5kaXNjcmltaW5hdG9yfVxyXG4rIFRhZzogJHt1c2VyLnRhZ31cclxuKyBJRDogJHt1c2VyLmlkfVxyXG4rIEF2YXRhcjogJHt1c2VyLmF2YXRhcn1cclxuKyBBdmF0YXIgVVJMOiBodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hdmF0YXJzLyR7dXNlci5pZH0vJHt1c2VyLmF2YXRhcn0uJHt1c2VyLmF2YXRhci5zdGFydHNXaXRoKFwiYV9cIikgPyBcImdpZlwiIDogXCJwbmdcIn0/c2l6ZT00MDk2XHJcbisgQ3JlYXRpb24gRGF0ZTogJHsoY3JlYXRlZEF0LmdldERhdGUoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0RnVsbFllYXIoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9ICR7Y3JlYXRlZEF0LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9aCAke2NyZWF0ZWRBdC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9bWluICR7Y3JlYXRlZEF0LmdldFNlY29uZHMoKX1zXHJcbisgRmxhZ3M6ICR7dXNlci5mbGFnc31cclxuKyBIYXMgTml0cm86ICR7dXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBFbWFpbDogJHt1c2VyLmVtYWlsfVxyXG4tIDJGQTogJHt1c2VyLm1mYUVuYWJsZWQgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIEhhcyBCZWVuIE9uIE1vYmlsZTogJHt1c2VyLm1vYmlsZSA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gUGhvbmU6ICR7dXNlci5waG9uZSB8fCBcIk5vbmVcIn1cclxuLSBWZXJpZmllZDogJHt1c2VyLnZlcmlmaWVkfWBcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGF0aXN0aWNzKCl7XHJcblxyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IE9iamVjdC52YWx1ZXMoR3VpbGRNb2R1bGUuZ2V0R3VpbGRzKCkpXHJcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LmtleXMocmVsYXRpb25TaGlwTW9kdWxlLmdldFJlbGF0aW9uc2hpcHMoKSlcclxuICAgICAgICBjb25zdCBmcmllbmRzID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0ZyaWVuZChlKSlcclxuICAgICAgICBjb25zdCBibG9ja2VkID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0Jsb2NrZWQoZSkpXHJcblxyXG4gICAgICAgIHJldHVybiBgKyBTZXJ2ZXIgQ291bnQ6ICR7Z3VpbGRzLmxlbmd0aH0gc2VydmVyc1xyXG4rIFJlbGF0aW9uczogJHtyZWxhdGlvbnMubGVuZ3RofSByZWxhdGlvbnNcclxuKyBGcmllbmRzIENvdW50OiAke2ZyaWVuZHMubGVuZ3RofSBmcmllbmRzXHJcbi0gQmxvY2tlZCBVc2VycyBDb3VudDogJHtibG9ja2VkLmxlbmd0aH0gYmxvY2tlZCB1c2Vyc2BcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmxldCBoaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcblxyXG5jbGFzcyBDb2RlQ29udGVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTEpbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUyKW1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcbiAgICAgICAgaWYoIXNjcm9sbGJhck1vZHVsZTEpc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbiAgICAgICAgaWYoIWhpZ2h0bGlnaHRKUyloaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHttZXNzYWdlTW9kdWxlMS5tYXJrdXB9ICR7bWVzc2FnZU1vZHVsZTIubWVzc2FnZUNvbnRlbnR9YH0+XHJcbiAgICAgICAgICAgIDxwcmU+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvY29kZT5cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuLi9tb2R1bGVzL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4uL21vZHVsZXMvZG9tdG9vbHNcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xyXG5pbXBvcnQgRWRpdEljb24gZnJvbSBcIi4vaWNvbnMvZWRpdFwiO1xyXG5pbXBvcnQgRGVsZXRlSWNvbiBmcm9tIFwiLi9pY29ucy9kZWxldGVcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5pbXBvcnQgVG9vbHRpcFdyYXAgZnJvbSBcIi4vdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IHsgcHJvY2Vzc0ZpbGUgfSBmcm9tIFwiLi4vbW9kdWxlcy9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuLi9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCB7IHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5jb25zdCBhbmNob3JDbGFzc2VzID0gQkRWMi5hbmNob3JDbGFzc2VzO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1BsdWdpbkNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2hvd1NldHRpbmdzID0gdGhpcy5zaG93U2V0dGluZ3MuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuaGFzU2V0dGluZ3MgPSB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiAmJiB0eXBlb2YodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCkgPT09IFwiZnVuY3Rpb25cIjtcclxuICAgICAgICB0aGlzLnNldHRpbmdzUGFuZWwgPSBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLmVkaXQgPSB0aGlzLmVkaXQuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmRlbGV0ZSA9IHRoaXMuZGVsZXRlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZWxvYWQgPSB0aGlzLnJlbG9hZC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmVuYWJsZWQsXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiBmYWxzZSxcclxuICAgICAgICAgICAgcmVsb2FkczogMCxcclxuICAgICAgICAgICAgdHJ1c3RlZDogZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dTZXR0aW5ncygpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzU2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtzZXR0aW5nczogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNsb3NlU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbFJlZi5jdXJyZW50LmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3NPcGVuOiBmYWxzZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybjtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICAgICAgICB0aGlzLnJlZnMuc2V0dGluZ3NwYW5lbC5hcHBlbmRDaGlsZCh0aGlzLnNldHRpbmdzUGFuZWwpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtM1wiXSkgcmV0dXJuO1xyXG4gICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IGlzSGlkZGVuID0gKGNvbnRhaW5lciwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCIuc2Nyb2xsZXJcIik7XHJcbiAgICAgICAgICAgIGlmICghaXNIaWRkZW4oY29udGFpbmVyLCB0aGlzTm9kZSkpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGVPZmZzZXQgPSBET00ub2Zmc2V0KHRoaXNOb2RlKTtcclxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyT2Zmc2V0ID0gRE9NLm9mZnNldChjb250YWluZXIpO1xyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZFBvaW50ID0gdGhpc05vZGVPZmZzZXQudG9wIC0gY29udGFpbmVyT2Zmc2V0LnRvcCArIGNvbnRhaW5lci5zY3JvbGxUb3AgLSAzMDtcclxuICAgICAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDMwMCxcclxuICAgICAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5kUG9pbnQgPiBvcmlnaW5hbCkgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsICsgKHByb2dyZXNzICogKGVuZFBvaW50IC0gb3JpZ2luYWwpKTtcclxuICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBvcmlnaW5hbCAtIChwcm9ncmVzcyAqIChvcmlnaW5hbCAtIGVuZFBvaW50KSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBnZXRTdHJpbmcodmFsdWUpIHtcclxuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gXCI/Pz9cIjtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNldHRpbmdzQ29tcG9uZW50KCkge1xyXG4gICAgICAgIHRyeSB7IHRoaXMuc2V0dGluZ3NQYW5lbCA9IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwoKTsgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBnZXQgc2V0dGluZ3MgcGFuZWwgZm9yIFwiICsgdGhpcy5uYW1lICsgXCIuXCIsIGVycik7IH1cclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1vcGVuIHVpLXN3aXRjaC1pdGVtXCIsIHJlZjogXCJjYXJkTm9kZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7c3R5bGU6IHtcImZsb2F0XCI6IFwicmlnaHRcIiwgXCJjdXJzb3JcIjogXCJwb2ludGVyXCJ9LCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcy5zZXR0aW5nc3BhbmVsLmlubmVySFRNTCA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzOiBmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFhTdmcsIG51bGwpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogYHBsdWdpbi1zZXR0aW5ncy0ke3RoaXMubmFtZX1gLCBjbGFzc05hbWU6IFwicGx1Z2luLXNldHRpbmdzXCIsIHJlZjogXCJzZXR0aW5nc3BhbmVsXCJ9KSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCAhPT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIiwgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6IHtfX2h0bWw6IHRoaXMuc2V0dGluZ3NQYW5lbH19KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGRUaXRsZShuYW1lLCB2ZXJzaW9uLCBhdXRob3IpIHtcclxuICAgICAgICBjb25zdCB0aXRsZSA9IFwie3tuYW1lfX0gdnt7dmVyc2lvbn19IGJ5IHt7YXV0aG9yfX1cIi5zcGxpdCgvKHt7W0EtWmEtel0rfX0pLyk7XHJcbiAgICAgICAgY29uc3QgbmFtZUluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7bmFtZX19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW25hbWVJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcIm5hbWUgYmRhLW5hbWVcIn0sIG5hbWUpO1xyXG4gICAgICAgIGNvbnN0IHZlcnNpb25JbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e3ZlcnNpb259fVwiKTtcclxuICAgICAgICBpZiAobmFtZUluZGV4KSB0aXRsZVt2ZXJzaW9uSW5kZXhdID0gUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJ2ZXJzaW9uIGJkYS12ZXJzaW9uXCJ9LCB2ZXJzaW9uKTtcclxuICAgICAgICBjb25zdCBhdXRob3JJbmRleCA9IHRpdGxlLmZpbmRJbmRleChzID0+IHMgPT0gXCJ7e2F1dGhvcn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImF1dGhvciBiZGEtYXV0aG9yXCJ9O1xyXG4gICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkKSB7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy5jbGFzc05hbWUgKz0gYCAke2FuY2hvckNsYXNzZXMuYW5jaG9yfSAke2FuY2hvckNsYXNzZXMuYW5jaG9yVW5kZXJsaW5lT25Ib3Zlcn1gO1xyXG4gICAgICAgICAgICAgICAgcHJvcHMudGFyZ2V0ID0gXCJfYmxhbmtcIjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yLmxpbmspIHByb3BzLmhyZWYgPSBhdXRob3IubGluaztcclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IuaWQpIHByb3BzLm9uQ2xpY2sgPSAoKSA9PiB7QkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7IEJEVjIub3BlbkRNKGF1dGhvci5pZCk7fTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aXRsZVthdXRob3JJbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KGF1dGhvci5saW5rIHx8IGF1dGhvci5pZCA/IFwiYVwiIDogXCJzcGFuXCIsIHByb3BzLCBhdXRob3IubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aXRsZS5mbGF0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUxpbmsodGl0bGUsIHVybCkge1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0ge2NsYXNzTmFtZTogXCJiZGEtbGluayBiZGEtbGluay13ZWJzaXRlXCIsIHRhcmdldDogXCJfYmxhbmtcIn07XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwic3RyaW5nXCIpIHByb3BzLmhyZWYgPSB1cmw7XHJcbiAgICAgICAgaWYgKHR5cGVvZih1cmwpID09IFwiZnVuY3Rpb25cIikgcHJvcHMub25DbGljayA9IChldmVudCkgPT4ge2V2ZW50LnByZXZlbnREZWZhdWx0KCk7IGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB1cmwoKTt9O1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJhXCIsIHByb3BzLCB0aXRsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFrZUJ1dHRvbih0aXRsZSwgY2hpbGRyZW4sIGFjdGlvbikge1xyXG4gICAgICAgIHJldHVybiA8VG9vbHRpcFdyYXAgY29sb3I9XCJibGFja1wiIHNpZGU9XCJ0b3BcIiB0ZXh0PXt0aXRsZX0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtYWRkb24tYnV0dG9uXCIgb25DbGljaz17YWN0aW9ufT57Y2hpbGRyZW59PC9kaXY+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD47XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKXtcclxuICAgICAgICB0aGlzLnVubW91bnRlZCA9IHRydWVcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlua3MoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSBbXTtcclxuICAgICAgICBjb25zdCBhZGRvbiA9IHRoaXMucHJvcHMuYWRkb247XHJcbiAgICAgICAgaWYgKGFkZG9uLndlYnNpdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIldlYnNpdGVcIiwgYWRkb24ud2Vic2l0ZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5zb3VyY2UpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlNvdXJjZVwiLCBhZGRvbi5zb3VyY2UpKTtcclxuICAgICAgICBpZiAoYWRkb24uaW52aXRlKSB7XHJcbiAgICAgICAgICAgIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlN1cHBvcnQgU2VydmVyXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RlciA9IC9cXC5nZ1xcLyguKikkLztcclxuICAgICAgICAgICAgICAgIGxldCBjb2RlID0gYWRkb24uaW52aXRlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlc3Rlci50ZXN0KGNvZGUpKSBjb2RlID0gY29kZS5tYXRjaCh0ZXN0ZXIpWzFdO1xyXG4gICAgICAgICAgICAgICAgQkRWMi5MYXllclN0YWNrLnBvcExheWVyKCk7XHJcbiAgICAgICAgICAgICAgICBCRFYyLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChjb2RlKTtcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYWRkb24uZG9uYXRlKSBsaW5rcy5wdXNoKHRoaXMubWFrZUxpbmsoXCJEb25hdGVcIiwgYWRkb24uZG9uYXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnBhdHJlb24pIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIlBhdHJlb25cIiwgYWRkb24ucGF0cmVvbikpO1xyXG4gICAgICAgIHJldHVybiBsaW5rcztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZm9vdGVyKCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmtzID0gdGhpcy5saW5rcztcclxuICAgICAgICByZXR1cm4gKGxpbmtzLmxlbmd0aCB8fCB0aGlzLmhhc1NldHRpbmdzKSAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLWZvb3RlciBiZGEtZm9vdGVyXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tbGlua3MgYmRhLWxpbmtzXCJ9LFxyXG4gICAgICAgICAgICAgICAgLi4uKGxpbmtzLm1hcCgoZWxlbWVudCwgaW5kZXgpID0+IGluZGV4IDwgbGlua3MubGVuZ3RoIC0gMSA/IFtlbGVtZW50LCBcIiB8IFwiXSA6IGVsZW1lbnQpLmZsYXQoKSlcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5oYXNTZXR0aW5ncyAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge29uQ2xpY2s6IHRoaXMuc2hvd1NldHRpbmdzLCBjbGFzc05hbWU6IFwiYmQtYnV0dG9uIGJkYS1zZXR0aW5ncy1idXR0b25cIiwgZGlzYWJsZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9LCBcIlNldHRpbmdzXCIpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnRvZ2dsZSAmJiB0aGlzLnByb3BzLnRvZ2dsZSh0aGlzLm5hbWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWR9KTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KCkge3RoaXMucHJvcHMuZWRpdCh0aGlzLm5hbWUpO31cclxuICAgIGRlbGV0ZSgpIHt0aGlzLnByb3BzLnJlbW92ZSh0aGlzLm5hbWUpO31cclxuICAgIHJlbG9hZCgpIHt0aGlzLnByb3BzLnJlbG9hZCh0aGlzLm5hbWUpO31cclxuXHJcbiAgICBnZXQgbmFtZSgpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXROYW1lKCkgOiB0aGlzLnByb3BzLmFkZG9uLm5hbWUpO31cclxuICAgIGdldCBhdXRob3IoKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0QXV0aG9yKCkgOiB0aGlzLnByb3BzLmFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiB0aGlzLnByb3BzLmFkZG9uLmRlc2NyaXB0aW9uKTt9XHJcbiAgICBnZXQgdmVyc2lvbigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRWZXJzaW9uKCkgOiB0aGlzLnByb3BzLmFkZG9uLnZlcnNpb24pO31cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc2V0dGluZ3MpIHJldHVybiB0aGlzLnNldHRpbmdzQ29tcG9uZW50O1xyXG4gICAgICAgIGNvbnN0IHthdXRob3JJZCwgYXV0aG9yTGlua30gPSB0aGlzLnByb3BzLmFkZG9uO1xyXG5cclxuICAgICAgICBjb25zdCBzdHlsZSA9IHt9XHJcbiAgICAgICAgaWYoIXRoaXMuaXNTY2FubmluZyl7XHJcbiAgICAgICAgICAgIHRoaXMuaXNTY2FubmluZyA9IHRydWVcclxuICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocmVzb2x2ZSh0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSA/IGNvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnVubW91bnRlZClyZXR1cm5cclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIGlzVHJ1c3RlZDogIXJlc3VsdC5zdXNwZWN0XHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7fSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQpe1xyXG4gICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkIGJkLWFkZG9uLWNhcmQgc2V0dGluZ3MtY2xvc2VkIHVpLXN3aXRjaC1pdGVtXCIsIHN0eWxlfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24taGVhZGVyIGJkYS1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZC10aXRsZSBiZGEtaGVhZGVyLXRpdGxlXCJ9LCB0aGlzLmJ1aWxkVGl0bGUodGhpcy5uYW1lLCB0aGlzLnZlcnNpb24sIHtuYW1lOiB0aGlzLmF1dGhvciwgaWQ6IGF1dGhvcklkLCBsaW5rOiBhdXRob3JMaW5rfSkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWFkZG9uLWNvbnRyb2xzIGJkYS1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5lZGl0ICYmIHRoaXMubWFrZUJ1dHRvbihcIkVkaXRcIiwgPEVkaXRJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5lZGl0KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZW1vdmUgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRGVsZXRlXCIsIDxEZWxldGVJY29uIGNsYXNzTmFtZT1cImJkLWljb25cIiAvPiwgdGhpcy5kZWxldGUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbG9hZCAmJiB0aGlzLm1ha2VCdXR0b24oXCJSZWxvYWRcIiwgPFJlbG9hZEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLnJlbG9hZCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMuc3RhdGUuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1zY3JvbGxlci13cmFwIGJkYS1kZXNjcmlwdGlvbi13cmFwIHNjcm9sbGVyLXdyYXAgZmFkZVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyIGJkLWFkZG9uLWRlc2NyaXB0aW9uIGJkYS1kZXNjcmlwdGlvbiBzY3JvbGxlclwifSwgdGhpcy5kZXNjcmlwdGlvbilcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5mb290ZXJcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWMkNfUGx1Z2luQ2FyZC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyIsImltcG9ydCBFcnJvckJvdW5kYXJ5IGZyb20gXCIuL2Vycm9yQm91bmRhcnlcIjtcclxuaW1wb3J0IENvbnRlbnRDb2x1bW4gZnJvbSBcIi4vY29udGVudENvbHVtblwiO1xyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4vdG9vbHNcIjtcclxuaW1wb3J0IFJlbG9hZEljb24gZnJvbSBcIi4vcmVsb2FkSWNvblwiO1xyXG5pbXBvcnQgQWRkb25DYXJkIGZyb20gXCIuL2FkZG9uY2FyZFwiO1xyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4vc2Nyb2xsZXJcIjtcclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL2NvbXBvbmVudHMvZHJvcGRvd25cIjtcclxuaW1wb3J0IFNlYXJjaCBmcm9tIFwiLi9jb21wb25lbnRzL3NlYXJjaFwiO1xyXG5cclxuaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZSwgcGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi4vbW9kdWxlcy9iZEFwaVwiO1xyXG5cclxuY29uc3QgVG9vbHRpcCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5yZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhcmRMaXN0IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge3NvcnQ6IFwibmFtZVwiLCBhc2NlbmRpbmc6IHRydWUsIHF1ZXJ5OiBcIlwifTtcclxuICAgICAgICB0aGlzLmlzUGx1Z2lucyA9IHRoaXMucHJvcHMudHlwZSA9PSBcInBsdWdpbnNcIjtcclxuICAgICAgICB0aGlzLmNvb2tpZSA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luQ29va2llIDogdGhlbWVDb29raWU7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyID0gdGhpcy5pc1BsdWdpbnMgPyBwbHVnaW5Nb2R1bGUgOiB0aGVtZU1vZHVsZTtcclxuXHJcbiAgICAgICAgdGhpcy5zb3J0ID0gdGhpcy5zb3J0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnNlID0gdGhpcy5yZXZlcnNlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2ggPSB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Gb2xkZXIoKSB7XHJcbiAgICAgICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnNoZWxsLm9wZW5JdGVtKHRoaXMuaXNQbHVnaW5zID8gQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciA6IENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcik7XHJcbiAgICB9XHJcblxyXG4gICAgZWRpdChuYW1lKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2cobmFtZSk7XHJcbiAgICAgICAgdGhpcy5tYW5hZ2VyLmVkaXQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlKG5hbWUpIHtcclxuICAgICAgICBjb25zdCBzaG91bGREZWxldGUgPSBhd2FpdCB0aGlzLmNvbmZpcm1EZWxldGUobmFtZSk7XHJcbiAgICAgICAgaWYgKCFzaG91bGREZWxldGUpIHJldHVybjtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZGVsZXRlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbmZpcm1EZWxldGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICAgICAgQmRBcGkuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKFwiQXJlIFlvdSBTdXJlP1wiLCBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSAke25hbWV9P2AsIHtcclxuICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBcIkRlbGV0ZVwiLFxyXG4gICAgICAgICAgICAgICAgb25Db25maXJtOiAoKSA9PiB7cmVzb2x2ZSh0cnVlKTt9LFxyXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHtyZXNvbHZlKGZhbHNlKTt9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3J0T3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiTmFtZVwiLCB2YWx1ZTogXCJuYW1lXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXV0aG9yXCIsIHZhbHVlOiBcImF1dGhvclwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIlZlcnNpb25cIiwgdmFsdWU6IFwidmVyc2lvblwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIlJlY2VudGx5IEFkZGVkXCIsIHZhbHVlOiBcImFkZGVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiTGFzdCBNb2RpZmllZFwiLCB2YWx1ZTogXCJtb2RpZmllZFwifSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkZpbGUgU2l6ZVwiLCB2YWx1ZTogXCJzaXplXCJ9LFxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRpcmVjdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAge2xhYmVsOiBcIkFzY2VuZGluZ1wiLCB2YWx1ZTogdHJ1ZX0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJEZXNjZW5kaW5nXCIsIHZhbHVlOiBmYWxzZX1cclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIHJldmVyc2UodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHthc2NlbmRpbmc6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc29ydCh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NvcnQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKGV2ZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7cXVlcnk6IGV2ZW50LnRhcmdldC52YWx1ZS50b0xvY2FsZUxvd2VyQ2FzZSgpfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvcHMoYWRkb24pIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXk6IHRoaXMuZ2V0TmFtZShhZGRvbiksXHJcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuY29va2llW3RoaXMuZ2V0TmFtZShhZGRvbildLFxyXG4gICAgICAgICAgICB0b2dnbGU6IHRoaXMubWFuYWdlci50b2dnbGUuYmluZCh0aGlzLm1hbmFnZXIpLFxyXG4gICAgICAgICAgICAvL2VkaXQ6IHRoaXMuZWRpdC5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGVsZXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcclxuICAgICAgICAgICAgaGFzaDogYWRkb24uaGFzaFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFkZG9ucygpIHtcclxuICAgICAgICBjb25zdCBzb3J0ZWRBZGRvbnMgPSB0aGlzLnByb3BzLmxpc3Quc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBjYXAgPSB0aGlzLnN0YXRlLnNvcnQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0aGlzLnN0YXRlLnNvcnQuc2xpY2UoMSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gYS5wbHVnaW4gJiYgYS5wbHVnaW5bYGdldCR7Y2FwfWBdID8gdGhpcy5nZXRTdHJpbmcoYS5wbHVnaW5bYGdldCR7Y2FwfWBdKCkpIDogYVt0aGlzLnN0YXRlLnNvcnRdO1xyXG4gICAgICAgICAgICBjb25zdCBzZWNvbmQgPSBiLnBsdWdpbiAmJiBiLnBsdWdpbltgZ2V0JHtjYXB9YF0gPyB0aGlzLmdldFN0cmluZyhiLnBsdWdpbltgZ2V0JHtjYXB9YF0oKSkgIDogYlt0aGlzLnN0YXRlLnNvcnRdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKGZpcnN0KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3QudG9Mb2NhbGVMb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNlY29uZC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0ID4gc2Vjb25kKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhID0gMDsgYSA8IHNvcnRlZEFkZG9ucy5sZW5ndGg7IGErKykge1xyXG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRBdXRob3IoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmdldERlc2NyaXB0aW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIG1hdGNoZXMgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBhdXRob3IudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCB2ZXJzaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcyhhZGRvbik7XHJcbiAgICAgICAgICAgIHJlbmRlcmVkLnB1c2goPEVycm9yQm91bmRhcnk+PEFkZG9uQ2FyZCB7Li4ucHJvcHN9IHJlbG9hZD17IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHRoaXMubWFuYWdlci5yZWxvYWQuYmluZCh0aGlzLm1hbmFnZXIpfSAvPjwvRXJyb3JCb3VuZGFyeT4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmFtZShhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0QXV0aG9yKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IGFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0VmVyc2lvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCByZWZyZXNoSWNvbiA9IDxUb29sdGlwIGNvbG9yPVwiYmxhY2tcIiBwb3NpdGlvbj1cInRvcFwiIHRleHQ9XCJSZWxvYWQgTGlzdFwiPlxyXG4gICAgICAgICAgICB7KHByb3BzKSA9PiBcclxuICAgICAgICAgICAgPFJlbG9hZEljb24gey4uLnByb3BzfSBjbGFzc05hbWU9XCJiZC1pY29uIGJkLXJlbG9hZCBiZC1yZWxvYWQtaGVhZGVyXCIgc2l6ZT1cIjE4cHhcIiBvbkNsaWNrPXthc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1BsdWdpbnMpIHBsdWdpbk1vZHVsZS51cGRhdGVQbHVnaW5MaXN0KCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIHRoZW1lTW9kdWxlLnVwZGF0ZVRoZW1lTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9fSAvPlxyXG4gICAgICAgICAgICB9PC9Ub29sdGlwPjtcclxuICAgICAgICBjb25zdCBhZGRvbkNhcmRzID0gdGhpcy5nZXRBZGRvbnMoKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIDxTY3JvbGxlciBjb250ZW50Q29sdW1uPXt0cnVlfSBmYWRlPXt0cnVlfSBkYXJrPXt0cnVlfT5cclxuICAgICAgICAgICAgICAgIDxDb250ZW50Q29sdW1uIHRpdGxlPXtgJHt0aGlzLnByb3BzLnR5cGUudG9VcHBlckNhc2UoKX3igJQke2FkZG9uQ2FyZHMubGVuZ3RofWB9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24ga2V5PVwiZm9sZGVyLWJ1dHRvblwiIGNsYXNzTmFtZT1cImJkLWJ1dHRvbiBiZC1wZmJ0blwiIG9uQ2xpY2s9e3RoaXMub3BlbkZvbGRlci5iaW5kKHRoaXMpfT5PcGVuIHt0aGlzLmlzUGx1Z2lucyA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCJ9IEZvbGRlcjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIHshc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0gJiYgcmVmcmVzaEljb259XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jb250cm9scyBiZC1hZGRvbi1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8U2VhcmNoIG9uQ2hhbmdlPXt0aGlzLnNlYXJjaH0gcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHt0aGlzLnByb3BzLnR5cGV9Li4uYH0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1kcm9wZG93bnNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5Tb3J0IGJ5OjwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPERyb3Bkb3duIG9wdGlvbnM9e3RoaXMuc29ydE9wdGlvbnN9IG9uQ2hhbmdlPXt0aGlzLnNvcnR9IHN0eWxlPVwidHJhbnNwYXJlbnRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+T3JkZXI6PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5kaXJlY3Rpb25zfSBvbkNoYW5nZT17dGhpcy5yZXZlcnNlfSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmRhLXNsaXN0IGJkLWFkZG9uLWxpc3RcIj57YWRkb25DYXJkc308L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvQ29udGVudENvbHVtbj5cclxuICAgICAgICAgICAgICAgIDxUb29scyBrZXk9XCJ0b29sc1wiIC8+XHJcbiAgICAgICAgICAgIDwvU2Nyb2xsZXI+O1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IENhcmRMaXN0LnByb3RvdHlwZS5yZW5kZXI7XHJcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYXJkTGlzdC5wcm90b3R5cGUsIFwicmVuZGVyXCIsIHtcclxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcclxuICAgIHNldDogZnVuY3Rpb24oKSB7Y29uc29sZS53YXJuKFwiQWRkb24gcG9saWN5IGZvciBwbHVnaW5zICM1IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvd2lraS9BZGRvbi1Qb2xpY2llcyNwbHVnaW5zXCIpO30sXHJcbiAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbn0pOyAiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRMb2dvIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwibWV0YWRhdGFcIiwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxNVwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzNcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjEwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzMpXCJ9LCBkOiBcIk0xMTk1LjQ0KzEzNS40NDJMMTE5NS40NCsxMzUuNDQyTDk5Ny42KzEzNi40NDJDMTAyNC4yKzE0OS43NDIrMTE3MC4zNCsxNjMuNTQyKzExOTMuNjQrMTc5Ljc0MkMxMjY0LjM0KzIyOC44NDIrMTMxOS43NCsyOTEuMjQyKzEzNTguMjQrMzY1LjA0MkMxMzk4LjE0KzQ0MS42NDIrMTQxOS43NCs1MzAuNjQyKzE0MjIuNTQrNjI5LjY0MkwxNDIyLjU0KzYzMC44NDJMMTQyMi41NCs2MzIuMDQyQzE0MjIuNTQrNzczLjE0MisxNDIyLjU0KzEyMjguMTQrMTQyMi41NCsxMzY5LjE0TDE0MjIuNTQrMTM3MC4zNEwxNDIyLjU0KzEzNzEuNTRDMTQxOS44NCsxNDcwLjU0KzEzOTguMjQrMTU1OS41NCsxMzU4LjI0KzE2MzYuMTRDMTMxOS43NCsxNzA5Ljk0KzEyNjQuNDQrMTc3Mi4zNCsxMTkzLjY0KzE4MjEuNDRDMTE3MS4wNCsxODM3LjE0KzEwMjUuNysxODUwLjU0KzEwMDArMTg2My41NEwxMTkzLjU0KzE4NjQuNTRDMTUzOS43NCsxODY2LjQ0KzE4NjQuNTQrMTY5My4zNCsxODY0LjU0KzEyOTYuNjRMMTg2NC41NCs3MTYuOTQyQzE4NjYuNDQrMzEyLjQ0MisxNTQxLjY0KzEzNS40NDIrMTE5NS40NCsxMzUuNDQyWlwiLCBmaWxsOiBcIiMxNzE3MTdcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzEpXCJ9LCBkOiBcIk0xNDY5LjI1KzYzMS40NDJDMTQ1OS41NSsyNzguMDQyKzExODMuMDUrMTM1LjQ0Mis4MjYuNjUrMTM1LjQ0MkwxMzUuNDUrMTM1LjQ0MkwxMzUuNDUrMTAwNEMxMzUuNDUrMTAwNCsxMzUuNDI3KzEyNTUuMjErMzU1LjYyNisxMjU1LjIxQzU3NS44MjUrMTI1NS4yMSs1NzUuODQ4KzEwMDQrNTc1Ljg0OCsxMDA0TDU3Ny40NSs0OTAuNDQyTDgzNC40NSs0OTAuNDQyQzExMDguOTUrNDkwLjQ0MisxMTA4Ljk1KzgzNS4zNDIrODM0LjQ1KzgzNS4zNDJMNjY0LjY1KzgzNS4zNDJMNjY0LjY1KzExNjQuODRMODM0LjQ1KzExNjQuODRDOTIzLjkzMisxMTY0Ljg0Kzk4NC4yNDQrMTIwMS40OCsxMDE1LjM5KzEyNTAuODdDMTA3OS43OCsxMzUzKzEwMTkuNDcrMTUwOS42NCs4MzQuNDUrMTUwOS42NEwxMzUuNDUrMTUwOS42NEwxMzUuNDUrMTg2NC41NEw4MjYuNjUrMTg2NC41NEMxMTgyLjk1KzE4NjQuNTQrMTQ1OS40NSsxNzIxLjk0KzE0NjkuMjUrMTM2OC41NEMxNDY5LjI1KzEyMDUuOTQrMTQyNC43NSsxMDg0LjQ0KzEzNDYuMzUrOTk5Ljk0MkMxNDI0Ljc1KzkxNS41NDIrMTQ2OS4yNSs3OTQuMDQyKzE0NjkuMjUrNjMxLjQ0MlpcIiwgZmlsbDogXCIjRkZGRkZGXCIsIG9wYWNpdHk6IFwiMVwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NoZWNrYm94IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImxpXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94IFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3gsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWlubmVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94SW5uZXIpWzBdLmNoZWNrYm94SW5uZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi4vaWNvbnMvZG93bmFycm93XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XHJcbiAgICAgICAgdGhpcy5kcm9wZG93biA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZGVNZW51ID0gdGhpcy5oaWRlTWVudS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dNZW51KGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZU1lbnUoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3RlZCgpIHtyZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09IHRoaXMuc3RhdGUudmFsdWUpO31cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LW9wdGlvbnNcIj5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qtb3B0aW9uJHtzZWxlY3RlZC52YWx1ZSA9PSBvcHQudmFsdWUgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gfSBvbkNsaWNrPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcywgb3B0LnZhbHVlKX0+e29wdC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZSA9PSBcInRyYW5zcGFyZW50XCIgPyBcIiBiZC1zZWxlY3QtdHJhbnNwYXJlbnRcIiA6IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5zdGF0ZS5vcGVuID8gXCIgbWVudS1vcGVuXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuLy8gcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBcIj5cclxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cclxuLy8gPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbi8vICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbi8vICAgICA8L2Rpdj5cclxuLy8gPC9kaXY+XHJcbi8vIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4vLyA8L2Rpdj47IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJiZC1zZWFyY2gtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCBvbkNoYW5nZT17dGhpcy5wcm9wcy5vbkNoYW5nZX0gb25LZXlEb3duPXt0aGlzLnByb3BzLm9uS2V5RG93bn0gdHlwZT1cInRleHRcIiBjbGFzc05hbWU9XCJiZC1zZWFyY2hcIiBwbGFjZWhvbGRlcj17dGhpcy5wcm9wcy5wbGFjZWhvbGRlcn0gbWF4TGVuZ3RoPVwiNTBcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxTZWFyY2hJY29uIC8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7Y2hlY2tlZDogdGhpcy5wcm9wcy5jaGVja2VkfTtcclxuICAgICAgICB0aGlzLm9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuZGlzYWJsZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHZhbHVlKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtjaGVja2VkOiB2YWx1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuU3dpdGNoIG9uQ2hhbmdlPXt0aGlzLm9uQ2hhbmdlfSB2YWx1ZT17dGhpcy5zdGF0ZS5jaGVja2VkfSAvPlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCBjb250ZW50TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW4gKyBcIiBcIitjb250ZW50TW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGl0bGVcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5jaGlsZHJlblxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuaW1wb3J0IFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBmcm9tIFwiLi9jc3NFZGl0b3JEZXRhY2hlZFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0Nzc0VkaXRvciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYucHJvcHMubGluZXMgPSAwO1xyXG4gICAgICAgIHNlbGYuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgc2VsZi5hdHRhY2ggPSBzZWxmLmF0dGFjaC5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoZWRFZGl0b3IgPSBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVjJDX0Nzc0VkaXRvckRldGFjaGVkLCB7YXR0YWNoOiBzZWxmLmF0dGFjaH0pO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLmRldGFjaCA9IHNlbGYuZGV0YWNoLmJpbmQoc2VsZik7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRldGFjaGVkOiB0aGlzLnByb3BzLmRldGFjaGVkIHx8IEJEVjIuZWRpdG9yRGV0YWNoZWRcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIC8vIHRoaXMudXBkYXRlTGluZUNvdW50KCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IgPSBhY2UuZWRpdChcImJkLWN1c3RvbWNzcy1lZGl0b3JcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VGhlbWUoXCJhY2UvdGhlbWUvbW9ub2thaVwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXNzaW9uLnNldE1vZGUoXCJhY2UvbW9kZS9jc3NcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0U2hvd1ByaW50TWFyZ2luKGZhbHNlKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRGb250U2l6ZSgxNCk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iub24oXCJjaGFuZ2VcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNzcygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLmRlc3Ryb3koKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAocHJldlN0YXRlLmRldGFjaGVkICYmICFzZWxmLnN0YXRlLmRldGFjaGVkKSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLmRldGFjaGVkUm9vdCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvZGVNaXJyb3IoKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY3NzXCIsXHJcbiAgICAgICAgICAgIGluZGVudFVuaXQ6IDQsXHJcbiAgICAgICAgICAgIHRoZW1lOiBcIm1hdGVyaWFsXCIsXHJcbiAgICAgICAgICAgIHNjcm9sbGJhclN0eWxlOiBcInNpbXBsZVwiXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY3NzKCkge1xyXG4gICAgICAgIGNvbnN0IF9jY3NzID0gRGF0YVN0b3JlLmdldEJERGF0YShcImJkY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIGxldCBjY3NzID0gXCJcIjtcclxuICAgICAgICBpZiAoX2Njc3MgJiYgX2Njc3MgIT09IFwiXCIpIHtcclxuICAgICAgICAgICAgY2NzcyA9IGF0b2IoX2Njc3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2NzcztcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVMaW5lQ291bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGluZUNvdW50ID0gdGhpcy5yZWZzLmVkaXRvci52YWx1ZS5zcGxpdChcIlxcblwiKS5sZW5ndGg7XHJcbiAgICAgICAgaWYgKGxpbmVDb3VudCA9PSB0aGlzLnByb3BzLmxpbmVzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZWZzLmxpbmVzLnRleHRDb250ZW50ID0gQXJyYXkuZnJvbShuZXcgQXJyYXkobGluZUNvdW50KSwgKF8sIGkpID0+IGkgKyAxKS5qb2luKFwiLlxcblwiKSArIFwiLlwiO1xyXG4gICAgICAgIHRoaXMucHJvcHMubGluZXMgPSBsaW5lQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG5cclxuICAgICAgICBjb25zdCB7ZGV0YWNoZWR9ID0gc2VsZi5zdGF0ZTtcclxuICAgICAgICBsZXQgY29udGVudE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW4pWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLCBzdHlsZToge3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0sXHJcbiAgICAgICAgICAgIGRldGFjaGVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7aWQ6IFwiZWRpdG9yLWRldGFjaGVkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBcIkN1c3RvbSBDU1MgRWRpdG9yXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImgzXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICBcIkVkaXRvciBEZXRhY2hlZFwiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJBdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAhZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJkZXRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBkZXRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJoZWxwLXRleHRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlByZXNzIFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiY29kZVwiLCB7Y2xhc3NOYW1lOiBcImlubGluZVwifSwgXCJjdHJsXCIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcIixcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiB3aXRoIHRoZSBlZGl0b3IgZm9jdXNlZCB0byBhY2Nlc3MgdGhlIGVkaXRvcidzIHNldHRpbmdzLlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soYXJnKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChhcmcpIHtcclxuICAgICAgICAgICAgY2FzZSBcInVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi51cGRhdGVDc3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICBjYXNlIFwic2F2ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcImRldGFjaFwiOlxyXG4gICAgICAgICAgICAgICAgc2VsZi5kZXRhY2goKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVDc3MoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiY3VzdG9tY3NzXCIpO1xyXG4gICAgICAgIERPTS5hZGRTdHlsZShcImN1c3RvbWNzc1wiLCB0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVDc3MoKSB7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcImJkY3VzdG9tY3NzXCIsIGJ0b2EodGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZGV0YWNoKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogdHJ1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnN0IGRyb290ID0gc2VsZi5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgaWYgKCFkcm9vdCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkZBSUxFRCBUTyBJTkpFQ1QgUk9PVDogLmFwcFwiKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihzZWxmLmRldGFjaGVkRWRpdG9yLCBkcm9vdCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRldGFjaGVkUm9vdCgpIHtcclxuICAgICAgICBjb25zdCBfcm9vdCA9IERPTS5xdWVyeShcIiNiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiKTtcclxuICAgICAgICBpZiAoIV9yb290KSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbmplY3REZXRhY2hlZFJvb3QoKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaGVkUm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdERldGFjaGVkUm9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHAuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXR0YWNoKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2VcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgQ2hlY2tib3ggZnJvbSBcIi4vY2hlY2tib3hcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Dc3NFZGl0b3JEZXRhY2hlZCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHNlbGYub25DbGljayA9IHNlbGYub25DbGljay5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYudXBkYXRlQ3NzID0gc2VsZi51cGRhdGVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnNhdmVDc3MgPSBzZWxmLnNhdmVDc3MuYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLm9uQ2hhbmdlID0gc2VsZi5vbkNoYW5nZS5iaW5kKHNlbGYpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZE1vdW50KCkge1xyXG4gICAgICAgIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gdHJ1ZTtcclxuICAgICAgICAvLyB0aGlzLnVwZGF0ZUxpbmVDb3VudCgpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yID0gYWNlLmVkaXQoXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFRoZW1lKFwiYWNlL3RoZW1lL21vbm9rYWlcIik7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5zZXRNb2RlKFwiYWNlL21vZGUvY3NzXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldFNob3dQcmludE1hcmdpbihmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5lZGl0b3Iuc2V0Rm9udFNpemUoMTQpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLm9uKFwiY2hhbmdlXCIsICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNhdmVDc3MoKTtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVDc3MoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmQtZGV0YWNoZWQtZWRpdG9yXCIpO1xyXG4gICAgICAgIEJEVjIuZWRpdG9yRGV0YWNoZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmVkaXRvci5kZXN0cm95KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBvcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLFxyXG4gICAgICAgICAgICBtb2RlOiBcImNzc1wiLFxyXG4gICAgICAgICAgICBpbmRlbnRVbml0OiA0LFxyXG4gICAgICAgICAgICB0aGVtZTogXCJtYXRlcmlhbFwiLFxyXG4gICAgICAgICAgICBzY3JvbGxiYXJTdHlsZTogXCJzaW1wbGVcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNzcygpIHtcclxuICAgICAgICBjb25zdCBfY2NzcyA9IERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKTtcclxuICAgICAgICBsZXQgY2NzcyA9IFwiXCI7XHJcbiAgICAgICAgaWYgKF9jY3NzICYmIF9jY3NzICE9PSBcIlwiKSB7XHJcbiAgICAgICAgICAgIGNjc3MgPSBhdG9iKF9jY3NzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHAuc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmQtZGV0YWNoZWQtY3NzLWVkaXRvclwiLCBpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWVkaXRvclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtaW5uZXJwYW5lXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHNlbGYub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBhdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2VkaXRvci1kZXRhY2hlZFwiKSkgc2VsZi5wcm9wcy5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgYnRvYSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCkpKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtoYXNFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJyZWFjdC1lcnJvclwifSwgXCJDb21wb25lbnQgRXJyb3JcIik7ICBcclxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz48cGF0aCBkPVwiTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwelwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEb3duQXJyb3cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwiI0ZGRkZGRlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTguMTIgOS4yOUwxMiAxMy4xN2wzLjg4LTMuODhjLjM5LS4zOSAxLjAyLS4zOSAxLjQxIDAgLjM5LjM5LjM5IDEuMDIgMCAxLjQxbC00LjU5IDQuNTljLS4zOS4zOS0xLjAyLjM5LTEuNDEgMEw2LjcgMTAuN2MtLjM5LS4zOS0uMzktMS4wMiAwLTEuNDEuMzktLjM4IDEuMDMtLjM5IDEuNDIgMHpcIi8+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRWRpdCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiI0ZGRkZGRlwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3pcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxyXG4gICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuPC9zdmc+ICovfVxyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxOHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCIjRkZGRkZGXCIgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fSBvbkNsaWNrPXt0aGlzLnByb3BzLm9uQ2xpY2t9PlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlYXJjaCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCIjRkZGRkZGXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19PlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJub25lXCIgZD1cIk0wIDBoMjR2MjRIMFYwelwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIEhvdyB0aGUgZnVjayBkaWQgSSBkbyB0aGlzXHJcbiAqL1xyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc0dyb3VwIGZyb20gXCIuL3NldHRpbmdzR3JvdXBcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZGVmYXVsdFJQQywgc2V0dGluZ3NSUEMgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEN1c3RvbVJpY2hQcmVzZW5jZSBmcm9tIFwiLi4vbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2VcIlxyXG5pbXBvcnQgdGltZXN0YW1wUmVuZGVyIGZyb20gXCIuL3RpbWVzdGFtcFJlbmRlclwiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiO1xyXG5cclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmxldCBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXNcclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1ByZXNlbmNlU2V0dGluZ3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IGRhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikgfHwgZGVmYXVsdFJQQyxcclxuICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmV2aWV3ID0gbnVsbFxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKXtcclxuICAgICAgICAgICAgdGhpcy5mZXRjaEFzc2V0cygpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmFzc2V0Q29tcG9uZW50cyA9IG5ldyBTZXQoKVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVdoZW5GZXRjaGVkKGNvbXApe1xyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmFkZChjb21wKVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0lucHV0VGV4dH0gc2V0dGluZyBcclxuICAgICAqL1xyXG4gICAgb25DaGFuZ2Uoc2V0dGluZywgdmFsdWUpe1xyXG4gICAgICAgIGxldCBkZWZhdWx0U2V0dGluZyA9IFJQQ1Byb3BzLmZpbmQoZSA9PiBlLmlkID09PSBzZXR0aW5nLnByb3BzLmlkKVxyXG5cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbihzZXR0aW5nc1JQQywgdGhpcy5zdGF0ZS5kYXRhLCB7XHJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFNldHRpbmcuaWRdOiAhIXZhbHVlID8gdmFsdWUgOiBudWxsXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuc3RhdGUuYXNzZXRzXHJcbiAgICAgICAgfSlcclxuICAgICAgICBpZihzZXR0aW5nLnByb3BzLmlkID09PSBcImFwcGxpY2F0aW9uX2lkXCIpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgICAgIHRoaXMucHJldmlldy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLnNldChzZXR0aW5nc1JQQylcclxuICAgIH1cclxuXHJcbiAgICBmZXRjaEFzc2V0cygpe1xyXG4gICAgICAgIGlmKHRoaXMuaXNmZXRjaGluZyA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgIGxldCBhcHAgPSB0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWRcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQgIT09IGFwcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICAgICAgfSwgNTAwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKCF0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSB0cnVlXHJcbiAgICAgICAgQ3VzdG9tUmljaFByZXNlbmNlLmZldGNoQXNzZXRzKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZClcclxuICAgICAgICAudGhlbihhc3NldHMgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogT2JqZWN0LmtleXMoYXNzZXRzKS5tYXAoayA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFzc2V0ID0gYXNzZXRzW2tdXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGFzc2V0LmlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhc3NldC5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBhc3NldC50eXBlXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzZmV0Y2hpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMuc3RhdGUuZGF0YSxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogW11cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzLmZvckVhY2goZSA9PiBlLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVQcmV2aWV3KGRhdGEpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBWMkNfUHJlc2VuY2VTZXR0aW5nc01vZHVsZXMgfHwgKFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiUmVyZW5kZXJpbmcgcnBjIG1hbmFnZXJcIilcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBjb250ZW50TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17Y29udGVudE1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifVxyXG4gICAgICAgICAgICBzdHlsZT17e3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0+XHJcbiAgICAgICAgICAgICAgICA8VjJDX1NldHRpbmdzR3JvdXAgdGl0bGU9XCJSaWNoUHJlc2VuY2UgU2V0dGluZ3NcIiBzZXR0aW5ncz17dGhpcy5wcm9wcy5zZXR0aW5nc30gb25DaGFuZ2U9e3RoaXMucHJvcHMub25DaGFuZ2V9Lz5cclxuICAgICAgICAgICAgICAgIDxWMkNfU2V0dGluZ3NUaXRsZSB0ZXh0PVwiUmljaFByZXNlbmNlXCIvPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICB7LyoqIG9wdGlvbnMgKi99XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMub3B0aW9uc0NvbXBvbmVudHN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJQcmV2aWV3XCIvPlxyXG4gICAgICAgICAgICAgICAgICAgIHsvKiogcHJldmlldyAqL31cclxuICAgICAgICAgICAgICAgICAgICA8UnBjUHJldmlldyBzZXR0aW5ncz17dGhpc30vPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17d2luZG93Lm9oZ29kb2hmdWNrfT5cclxuICAgICAgICAgICAgICAgICAgICBPaCBnb2QgT2ggZnVja1xyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIHN0eWxlPXt7b3BhY2l0eTogMC4wMX19IG9uQ2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuc2hlbGwub3BlbkV4dGVybmFsKFwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1Ma1lhN3Jwc19nNFwiKVxyXG4gICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VlID8gSSBwdWxsZWQgYSBsaXRsZSBzbmVha3kgb24geWFcclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9uc0NvbXBvbmVudHMoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgfHwgKHRoaXMuX29wdGlvbnNDb21wb25lbnRzID0gUlBDUHJvcHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICBpZihlLnR5cGUgPT09IFwidGV4dFwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRUZXh0IHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBbPElucHV0TnVtYmVyIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XS8qXHJcbiAgICAgICAgICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH19IC8+KVxyXG4gICAgICAgICAgICAgICAgfSovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcImNob2ljZVwiKXtcclxuICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dENob2ljZSBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0gY2hvaWNlcz17W3t2YWx1ZTogXCJub25lXCIsIGxhYmVsOiBcIk5vIGFzc2V0c1wifV0uY29uY2F0KHRoaXMuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVua25vd24gY2hvaWNlLlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxufVxyXG5jb25zdCBSUENQcm9wcyA9IFtcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJBcHBsaWNhdGlvbiBJRFwiLFxyXG4gICAgICAgIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJOYW1lXCIsXHJcbiAgICAgICAgaWQ6IFwibmFtZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkRldGFpbHNcIixcclxuICAgICAgICBpZDogXCJkZXRhaWxzXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiQnJvd3NpbmcgRGlzY29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlN0YXRlXCIsXHJcbiAgICAgICAgaWQ6IFwic3RhdGVcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmQgQ2xpZW50XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiVGltZXN0YW1wIFN0YXJ0XCIsXHJcbiAgICAgICAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXHJcbiAgICAgICAgZ2V0IHBsYWNlaG9sZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMYXJnZUFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLmxhcmdlXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTbWFsbEFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLnNtYWxsXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuXVxyXG5cclxubGV0IGlucHV0VGV4dE1vZHVsZXNcclxuY2xhc3MgSW5wdXRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIGlmKGlucHV0VGV4dE1vZHVsZXMgJiYgaW5wdXRUZXh0TW9kdWxlc1swXSlyZXR1cm4gaW5wdXRUZXh0TW9kdWxlc1xyXG4gICAgICAgIHJldHVybiBpbnB1dFRleHRNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgICAgIGlucHV0TW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMixcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dE51bWJlck1vZHVsZXNcclxuY2xhc3MgSW5wdXROdW1iZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0TnVtYmVyTW9kdWxlcyB8fCAoSW5wdXROdW1iZXJNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXSxcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gdHlwZT1cIm51bWJlclwiIG9uQ2hhbmdlPXsodmFsdWUsIG5hbWUsIGlucHV0KSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdKy9nLCBcIlwiKVxyXG4gICAgICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLnN0YXRlLmRhdGEpe1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICAgICAge3NldHRpbmcuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiID8gXHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gdGV4dD1cIkNvcHkgY3VycmVudCB0aW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgRGlzY29yZE5hdGl2ZS5jbGlwYm9hcmQuY29weShEYXRlLm5vdygpK1wiXCIpXHJcbiAgICAgICAgICAgICAgICB9fSBjb2xvcj1cImJyYW5kXCIvPiA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgSW5wdXRDaG9pY2VNb2R1bGVzXHJcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA/IFwiYXNzZXQtXCIrdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gOiBcIm5vbmVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIudXBkYXRlV2hlbkZldGNoZWQodGhpcylcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShkYXRhKXtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRhLnZhbHVlXHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSA9PT0gXCJub25lXCIgPyBudWxsIDogdmFsdWUucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSA9PT0gXCJub25lXCIgPyBudWxsIDogdGhpcy5zdGF0ZS5kYXRhLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBJbnB1dENob2ljZU1vZHVsZXMgfHwgKElucHV0Q2hvaWNlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgb3B0aW9ucy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICBsYWJlbDogXCJObyBhc3NldHNcIlxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb3B0aW9ucz17b3B0aW9uc30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gLz5cclxuICAgICAgICAgICAgICAgIHsvKjxTZWxlY3QgdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gb3B0aW9ucz17b3B0aW9uc30vPiovfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IERpdmlkZXJNb2R1bGVzID0gW11cclxuY2xhc3MgRGl2aWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gRGl2aWRlck1vZHVsZXMmJkRpdmlkZXJNb2R1bGVzWzBdID8gRGl2aWRlck1vZHVsZXMgOiAoRGl2aWRlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlckRlZmF1bHQpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBkaXZpZGVyLFxyXG4gICAgICAgICAgICBkaXZpZGVyRGVmYXVsdFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2Ake2RpdmlkZXIuZGl2aWRlcn0gJHtkaXZpZGVyRGVmYXVsdC5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gdGV4dD17dGhpcy5wcm9wcy50aXRsZX0gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfSBjb2xvcj1cImJyYW5kXCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMgPSB7fSl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBcInByb2ZpbGVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRhYnMgPSBbXVxyXG5cclxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGFiKHRhYil7XHJcbiAgICAgICAgbGV0IGFuY2llbnRUYWIgPSB0aGlzLnN0YXRlLmFjdGl2ZVxyXG4gICAgICAgIGlmKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZClyZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc2V0QWN0aXZlKGZhbHNlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGFiLnNldEFjdGl2ZSh0cnVlKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHByZXZpZXcgPSBuZXcgdGhpcy5wcmV2aWV3KHtcclxuICAgICAgICAgICAgcHJldmlldzogdGhpc1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgcHJldmlldy5zZXRTdGF0ZSh0aGlzLnN0YXRlLnJwYylcclxuICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiV3JhcHBlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYm5hdlwiIHN0eWxlPXt7ZmxleDogXCIwIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICA8VGFiIHByZXZpZXc9e3RoaXN9IHRpdGxlPVwiRnVsbCBQcm9maWxlXCIgaWQ9XCJwcm9maWxlXCIvPlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIlVzZXIgUG9wb3V0XCIgaWQ9XCJwb3BvdXRcIi8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICB7cHJldmlldy5yZW5kZXIoKX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9ICAgXHJcblxyXG4gICAgaXNBY3RpdmUodGFiKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hY3RpdmUgPT09IHRhYlxyXG4gICAgfVxyXG5cclxuICAgIGdldCBwcmV2aWV3KCl7XHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUgPT09IFwicHJvZmlsZVwiKXJldHVybiBQcm9maWxlXHJcbiAgICAgICAgcmV0dXJuIFBvcG91dFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBUYWIgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgIHN1cGVyKHByb3BzKVxyXG5cclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBhY3RpdmU6IHByb3BzLnByZXZpZXcuaXNBY3RpdmUocHJvcHMuaWQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHByb3BzLnByZXZpZXcudGFicy5wdXNoKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgc2V0QWN0aXZlKGlzQWN0aXZlKXtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgYWN0aXZlOiAhIWlzQWN0aXZlXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lID0gYGxjLW5hdkl0ZW1gXHJcbiAgICAgICAgaWYodGhpcy5zdGF0ZS5hY3RpdmUpe1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtQWN0aXZlYFxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gYCBsYy1uYXZJdGVtSW5hY3RpdmVgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZX0gb25DbGljaz17KCk9PntcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5wcmV2aWV3LmNoYW5nZVRhYih0aGlzKVxyXG4gICAgICAgIH19PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy50aXRsZX1cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBwb3BvdXRNb2R1bGVcclxuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHBvcG91dE1vZHVsZSB8fCAocG9wb3V0TW9kdWxlID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS51c2VyUG9wb3V0KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS52ZXJ0aWNhbCAmJiBlLmFsaWduU3RyZXRjaCAmJiAhZS5zdHJlYW1lck1vZGVFbmFibGVkQnRuKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYm90KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuYWN0aXZpdHlVc2VyUG9wb3V0KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubXV0ZWQgJiYgZS53cmFwcGVyICYmIGUuYmFzZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnRoZW1lR2hvc3RIYWlybGluZUNoYW5uZWxzKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubm90ZSAmJiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IDEpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wcm8gJiYgZS5pbmxpbmUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMpWzBdLmRlZmF1bHQuTWVzc2FnZXMsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBwcm90aXBNb2R1bGUxLFxyXG4gICAgICAgICAgICBjb2xvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIE1lc3NhZ2VzLFxyXG4gICAgICAgICAgICBhdmF0YXJNb2R1bGUxLFxyXG4gICAgICAgICAgICB1c2VyTW9kdWxlMVxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuICAgICAgICBsZXQgdXNlciA9IHVzZXJNb2R1bGUxLmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpXHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgdGltZXN0YW1wQ2xhc3MgPSB0aW1lc3RhbXBDbGFzcyB8fCBhY3Rpdml0eU1vZHVsZTEudGltZXN0YW1wXHJcblxyXG4gICAgICAgIGxldCBpbWFnZXMgPSAoKCkgPT4ge1xyXG4gICAgICAgICAgICBpZighZGF0YVtcImFzc2V0cy5sYXJnZVwiXSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgaW1hZ2VzID0gW11cclxuICAgICAgICAgICAgaWYoZGF0YVtcImFzc2V0cy5sYXJnZVwiXSl7XHJcbiAgICAgICAgICAgICAgICBpbWFnZXMucHVzaCg8aW1nIGFsdD1cIlwiIHNyYz17YGh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2FwcC1hc3NldHMvJHtkYXRhLmFwcGxpY2F0aW9uX2lkfS8ke2RhdGFbXCJhc3NldHMubGFyZ2VcIl19LnBuZ2B9IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYXNzZXRzTGFyZ2VJbWFnZVVzZXJQb3BvdXR9ICR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXSA/IGFjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZU1hc2tVc2VyUG9wb3V0IDogXCJcIn1gfSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLnNtYWxsXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5zbWFsbFwiXX0ucG5nYH0gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHNTbWFsbEltYWdlVXNlclBvcG91dH0gLz4pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYoIWltYWdlcy5sZW5ndGgpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hc3NldHN9PlxyXG4gICAgICAgICAgICAgICAge2ltYWdlc31cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfSkoKVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9XCJsYy11c2VyUG9wb3V0XCI+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+PC9yZWN0PlxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgdGltZXN0YW1wQ2xhc3MgPSBcIlwiXHJcblxyXG5sZXQgUHJvZmlsZU1vZHVsZXNcclxuY2xhc3MgUHJvZmlsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBQcm9maWxlTW9kdWxlcyB8fCAoUHJvZmlsZU1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXggJiYgZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucG9pbnRlckV2ZW50cylbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmJvdClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFjdGl2aXR5UHJvZmlsZSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm11dGVkICYmIGUud3JhcHBlciAmJiBlLmJhc2UpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlckZhZGUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub3RlICYmIE9iamVjdC5rZXlzKGUpLmxlbmd0aCA9PT0gMSlbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzKVswXS5kZWZhdWx0Lk1lc3NhZ2VzXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgdXNlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKVswXS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBsZXQgYXZhdGFyVVJMID0gdXNlci5nZXRBdmF0YXJVUkwodXNlci5hdmF0YXIuc3RhcnRzV2l0aChcImFfXCIpID8gXCJnaWZcIiA6IFwicG5nXCIpXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgZmxleE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHN0eWxpbmdNb2R1bGUxLFxyXG4gICAgICAgICAgICByb290TW9kdWxlMSxcclxuICAgICAgICAgICAgYXZhdGFyTW9kdWxlMSxcclxuICAgICAgICAgICAgbmFtZVRhZ01vZHVsZTEsXHJcbiAgICAgICAgICAgIGFjdGl2aXR5TW9kdWxlMSxcclxuICAgICAgICAgICAgdGV4dE1vZHVsZTEsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUxLFxyXG4gICAgICAgICAgICBzY3JvbGxlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIG5vdGVNb2R1bGUxLFxyXG4gICAgICAgICAgICBNZXNzYWdlc1xyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UlBDLCB0aGlzLnByb3BzLnByZXZpZXcucHJvcHMuc2V0dGluZ3Muc3RhdGUuZGF0YSlcclxuICAgICAgICB0aW1lc3RhbXBDbGFzcyA9IHRpbWVzdGFtcENsYXNzIHx8IGFjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXBcclxuXHJcbiAgICAgICAgbGV0IGltYWdlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgIGxldCBpbWFnZXMgPSBbXVxyXG4gICAgICAgICAgICBpZihkYXRhW1wiYXNzZXRzLmxhcmdlXCJdKXtcclxuICAgICAgICAgICAgICAgIGltYWdlcy5wdXNoKDxpbWcgYWx0PVwiXCIgc3JjPXtgaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vYXBwLWFzc2V0cy8ke2RhdGEuYXBwbGljYXRpb25faWR9LyR7ZGF0YVtcImFzc2V0cy5sYXJnZVwiXX0ucG5nYH0gY2xhc3M9e2Ake2FjdGl2aXR5TW9kdWxlMS5hc3NldHNMYXJnZUltYWdlUHJvZmlsZX0gJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdID8gYWN0aXZpdHlNb2R1bGUxLmFzc2V0c0xhcmdlTWFza1Byb2ZpbGUgOiBcIlwifWB9IC8+KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKGRhdGFbXCJhc3NldHMuc21hbGxcIl0pe1xyXG4gICAgICAgICAgICAgICAgaW1hZ2VzLnB1c2goPGltZyBhbHQ9XCJcIiBzcmM9e2BodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9hcHAtYXNzZXRzLyR7ZGF0YS5hcHBsaWNhdGlvbl9pZH0vJHtkYXRhW1wiYXNzZXRzLnNtYWxsXCJdfS5wbmdgfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c1NtYWxsSW1hZ2VQcm9maWxlfSAvPilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZighaW1hZ2VzLmxlbmd0aClyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmFzc2V0c30+XHJcbiAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9KSgpXHJcblxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibGMtdGFiXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbGV4TW9kdWxlMS5mbGV4fSAke3N0eWxpbmdNb2R1bGUxLnZlcnRpY2FsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnblN0cmV0Y2h9ICR7c3R5bGluZ01vZHVsZTEubm9XcmFwfSAke3Jvb3RNb2R1bGUxLnJvb3R9YH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS50b3BTZWN0aW9uUGxheWluZ30+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9e3Jvb3RNb2R1bGUxLmhlYWRlcn0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtyb290TW9kdWxlMS5hdmF0YXJ9ICR7YXZhdGFyTW9kdWxlMS53cmFwcGVyfWB9IHJvbGU9XCJpbWdcIiBzdHlsZT17e3dpZHRoOiBcIjgwcHhcIiwgaGVpZ2h0OiBcIjgwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI5MlwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA5MiA4MFwiIGNsYXNzPXtgJHthdmF0YXJNb2R1bGUxLm1hc2t9ICR7YXZhdGFyTW9kdWxlMS5zdmd9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JlaWduT2JqZWN0IHg9XCIwXCIgeT1cIjBcIiB3aWR0aD1cIjgwXCIgaGVpZ2h0PVwiODBcIiBtYXNrPVwidXJsKCNzdmctbWFzay1hdmF0YXItc3RhdHVzLXJvdW5kLTgwKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9e2F2YXRhclVSTH0gYWx0PVwiIFwiIGNsYXNzPXthdmF0YXJNb2R1bGUxLmF2YXRhcn0gLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JlaWduT2JqZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3RhdHVzIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLmhlYWRlckluZm99YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEubmFtZVRhZ30gJHtuYW1lVGFnTW9kdWxlMS5uYW1lVGFnfWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17YCR7cm9vdE1vZHVsZTEudXNlcm5hbWV9ICR7cm9vdE1vZHVsZTEudXNlcm5hbWV9YH0+e3VzZXIudXNlcm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz17cm9vdE1vZHVsZTEuZGlzY3JpbWluYXRvcn0+I3t1c2VyLmRpc2NyaW1pbmF0b3J9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e2Ake2ZsZXhNb2R1bGUxLmZsZXh9ICR7ZmxleE1vZHVsZTEuaG9yaXpvbnRhbH0gJHtzdHlsaW5nTW9kdWxlMS5qdXN0aWZ5U3RhcnR9ICR7c3R5bGluZ01vZHVsZTEuYWxpZ25TdHJldGNofSAke3N0eWxpbmdNb2R1bGUxLm5vV3JhcH0gJHtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VzfWB9IHN0eWxlPXt7ZmxleDogXCIxIDEgYXV0b1wifX0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCYWRnZXMgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuaGVhZGVyRmlsbH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEuYWN0aXZpdHlQcm9maWxlfSAke3Jvb3RNb2R1bGUxLmFjdGl2aXR5fWB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz17YCR7YWN0aXZpdHlNb2R1bGUxLmhlYWRlclRleHROb3JtYWx9ICR7dGV4dE1vZHVsZTEuYmFzZX0gJHtzaXplTW9kdWxlMS5zaXplMTJ9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtNZXNzYWdlcy5VU0VSX0FDVElWSVRZX0hFQURFUl9QTEFZSU5HfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmJvZHlOb3JtYWx9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aW1hZ2VzfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtpbWFnZXMgPyBhY3Rpdml0eU1vZHVsZTEuY29udGVudEltYWdlc1Byb2ZpbGUgOiBhY3Rpdml0eU1vZHVsZTEuY29udGVudE5vSW1hZ2VzVXNlclBvcG91dH0gc3R5bGU9e3tmbGV4OiBcIjEgMSBhdXRvXCJ9fT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhLm5hbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGgzIGNsYXNzPXtgJHthY3Rpdml0eU1vZHVsZTEubmFtZU5vcm1hbH0gJHt0ZXh0TW9kdWxlMS5iYXNlfSAke3NpemVNb2R1bGUxLnNpemUxNH1gfSB0aXRsZT17ZGF0YS5uYW1lfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS5hY3Rpdml0eU5hbWV9PntkYXRhLm5hbWV9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuZGV0YWlscylyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8ZGl2IHRpdGxlPXtkYXRhLnRpdGxlfSBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLmRldGFpbHN9PntkYXRhLmRldGFpbHN9PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeygoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGEuc3RhdGUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gPGRpdiBjbGFzcz17YWN0aXZpdHlNb2R1bGUxLnN0YXRlfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gdGl0bGU9e2RhdGEuc3RhdGV9PntkYXRhLnN0YXRlfTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKCl9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighZGF0YVtcInRpbWVzdGFtcHMuc3RhcnRcIl0pcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGltZUNvbXBvbmVudCA9IHRpbWVzdGFtcFJlbmRlcihUaW1lc3RhbXAsIE1lc3NhZ2VzKVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDxkaXYgY2xhc3M9e2FjdGl2aXR5TW9kdWxlMS50aW1lc3RhbXB9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudCh0aW1lQ29tcG9uZW50LCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkYXRhW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSgpfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuYm9keX0+XHJcblx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17YCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlfWB9PlxyXG5cdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyfT5cclxuXHRcdFx0XHRcdFx0XHQgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9ufT5cclxuXHRcdFx0XHRcdFx0XHRcdCAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS51c2VySW5mb1NlY3Rpb25IZWFkZXJ9PntNZXNzYWdlcy5OT1RFfTwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDxkaXYgY2xhc3M9e2Ake3Jvb3RNb2R1bGUxLm5vdGV9ICR7bm90ZU1vZHVsZTEubm90ZX1gfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBwbGFjZWhvbGRlcj17TWVzc2FnZXMuTk9URV9QTEFDRUhPTERFUn0gbWF4bGVuZ3RoPVwiMjU2XCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lKVswXS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBzdHlsZT17e2hlaWdodDogXCI0MHB4XCJ9fSBkaXNhYmxlZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPlxyXG5cdFx0XHRcdFx0XHRcdFx0ICAgIDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdCAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29ubmVjdGVkQWNjb3VudHMgLz5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGMtIFwiPjwvZGl2PlxyXG4gICAgICAgIF1cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQ29ubmVjdGVkQWNjb3VudHMgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IGFjY291bnRzID0gW11cclxuICAgICAgICBsZXQgcm9vdE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXVxyXG4gICAgICAgIGxldCBBY2NvdW50TW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldEFjY291bnRzKVswXS5kZWZhdWx0XHJcblxyXG4gICAgICAgIGxldCBhY2NzID0gQWNjb3VudE1vZHVsZTEuZ2V0QWNjb3VudHMoKS5maWx0ZXIoZSA9PiBlLnZpc2liaWxpdHkgPT09IDEpXHJcbiAgICAgICAgZm9yKGxldCBhY2Mgb2YgYWNjcyl7XHJcbiAgICAgICAgICAgIGFjY291bnRzLnB1c2goPENvbm5lY3RlZEFjY291bnQgYWNjPXthY2N9IC8+KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoYWNjb3VudHMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEudXNlckluZm9TZWN0aW9ufT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9e3Jvb3RNb2R1bGUxLmNvbm5lY3RlZEFjY291bnRzfT5cclxuICAgICAgICAgICAgICAgICAgICB7YWNjb3VudHN9XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+KVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb25uZWN0ZWRBY2NvdW50IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUxLFxyXG4gICAgICAgICAgICBzdHlsaW5nTW9kdWxlMSxcclxuICAgICAgICAgICAgcm9vdE1vZHVsZTEsXHJcbiAgICAgICAgICAgIGZsb3dlck1vZHVsZTEsXHJcbiAgICAgICAgICAgIGFuY2hvck1vZHVsZTEsXHJcbiAgICAgICAgICAgIFNvY2lhbENvbnN0YW50c1xyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsZXggJiYgZS5faG9yaXpvbnRhbClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnRpY2FsICYmIGUuYWxpZ25TdHJldGNoICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWRCdG4pWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b3BTZWN0aW9uU3RyZWFtaW5nKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmFuY2hvcilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldCAmJiBlLmRlZmF1bHQubWFwKVswXS5kZWZhdWx0XHJcbiAgICAgICAgXVxyXG4gICAgICAgIGxldCBhY2MgPSB0aGlzLnByb3BzLmFjY1xyXG4gICAgICAgIGxldCBjb25zdGFudHNTb2NpYWwgPSBTb2NpYWxDb25zdGFudHMuZ2V0KGFjYy50eXBlKVxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzcz17YCR7ZmxleE1vZHVsZTEuZmxleH0gJHtmbGV4TW9kdWxlMS5ob3Jpem9udGFsfSAke3N0eWxpbmdNb2R1bGUxLmp1c3RpZnlTdGFydH0gJHtzdHlsaW5nTW9kdWxlMS5hbGlnbkNlbnRlcn0gJHtzdHlsaW5nTW9kdWxlMS5ub1dyYXB9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudH1gfSBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICA8aW1nIGFsdD17YExvZ28gJHtjb25zdGFudHNTb2NpYWwubmFtZX1gfSBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudEljb259IHNyYz17Y29uc3RhbnRzU29jaWFsLmljb24uY29sb3IgfHwgY29uc3RhbnRzU29jaWFsLmljb24ud2hpdGUgfHwgY29uc3RhbnRzU29jaWFsLmljb24uZ3JleX0gLz5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz17cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudE5hbWVJbm5lcn0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50TmFtZX0+e2FjYy5uYW1lfTwvZGl2PlxyXG4gICAgICAgICAgICAgICAge2FjYy52ZXJpZmllZCA/ICg8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtgJHtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJDb250YWluZXJ9ICR7cm9vdE1vZHVsZTEuY29ubmVjdGVkQWNjb3VudFZlcmlmaWVkSWNvbn1gfSBzdHlsZT17e3dpZHRoOiBcIjE2cHhcIiwgaGVpZ2h0OiBcIjE2cHhcIn19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPXtmbG93ZXJNb2R1bGUxLmZsb3dlclN0YXJ9IHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTUuMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiM0ZjU0NWNcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCIgZD1cIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPXtmbG93ZXJNb2R1bGUxLmNoaWxkQ29udGFpbmVyfT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNS4yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk03LjQsMTEuMTcsNCw4LjYyLDUsNy4yNmwyLDEuNTNMMTAuNjQsNGwxLjM2LDFaXCIgZmlsbD1cIiNmZmZmZmZcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+KSA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8YSBjbGFzcz17YCR7YW5jaG9yTW9kdWxlMS5hbmNob3J9ICR7YW5jaG9yTW9kdWxlMS5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWB9IHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIiB0YXJnZXQ9XCJfYmxhbmtcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPXtyb290TW9kdWxlMS5jb25uZWN0ZWRBY2NvdW50T3Blbkljb259IHdpZHRoPVwiMjRcIiBoZWlnaHQ9XCIyNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiY3VycmVudENvbG9yXCIgZD1cIk0xMCA1VjNINS4zNzVDNC4wNjUxOSAzIDMgNC4wNjUxOSAzIDUuMzc1VjE4LjYyNUMzIDE5LjkzNiA0LjA2NTE5IDIxIDUuMzc1IDIxSDE4LjYyNUMxOS45MzYgMjEgMjEgMTkuOTM2IDIxIDE4LjYyNVYxNEgxOVYxOUg1VjVIMTBaXCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTIxIDIuOTk5MDJIMTRWNC45OTkwMkgxNy41ODZMOS4yOTI5NyAxMy4yOTJMMTAuNzA3IDE0LjcwNkwxOSA2LjQxMzAyVjkuOTk5MDJIMjFWMi45OTkwMlpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQmFkZ2VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCB1c2VyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIGxldCByb290TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuICAgICAgICBsZXQgVXNlckZsYWdzID0gQkRNb2R1bGVzLmdldChlID0+IGUuVXNlckZsYWdzKVswXS5Vc2VyRmxhZ3NcclxuICAgICAgICBsZXQgYmFkZ2VzID0gW11cclxuICAgICAgICBsZXQgc2VyaWFsaXplZCA9IFtdXHJcblxyXG4gICAgICAgIGZvcihsZXQgZmxhZ05hbWUgaW4gVXNlckZsYWdzKXtcclxuICAgICAgICAgICAgaWYodXNlci5oYXNGbGFnKFVzZXJGbGFnc1tmbGFnTmFtZV0pKXNlcmlhbGl6ZWQucHVzaChmbGFnTmFtZSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcihsZXQgZmxhZ05hbWUgb2Ygc2VyaWFsaXplZCl7XHJcbiAgICAgICAgICAgIGxldCBzZWFyY2hhYmxlID0gYHByb2ZpbGVCYWRnZSR7ZmxhZ05hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiIFwiKS5zcGxpdChcIiBcIikubWFwKGUgPT4gZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSkpLmpvaW4oXCJcIil9YFxyXG4gICAgICAgICAgICBzZWFyY2hhYmxlID0gc2VhcmNoYWJsZS5yZXBsYWNlKFwiSHlwZXNxdWFkT25saW5lXCIsIFwiSHlwZVNxdWFkT25saW5lXCIpXHJcbiAgICAgICAgICAgIGlmKCFyb290TW9kdWxlW3NlYXJjaGFibGVdKWNvbnRpbnVlXHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKDxCYWRnZSBuYW1lPXtzZWFyY2hhYmxlfS8+KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYodXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXtcclxuICAgICAgICAgICAgYmFkZ2VzLnB1c2goPEJhZGdlIG5hbWU9XCJwcm9maWxlQmFkZ2VQcmVtaXVtXCIgLz4pXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBiYWRnZXNcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgQmFkZ2UgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHJvb3RNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUudG9wU2VjdGlvblN0cmVhbWluZylbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtyb290TW9kdWxlMS5wcm9maWxlQmFkZ2VXcmFwcGVyfT5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiByb2xlPVwiYnV0dG9uXCIgdGFiaW5kZXg9XCIwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz17YCR7cm9vdE1vZHVsZTEucHJvZmlsZUJhZGdlfSAke3Jvb3RNb2R1bGUxW3RoaXMucHJvcHMubmFtZV19YH0+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgVGltZXN0YW1wIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17dGltZXN0YW1wQ2xhc3N9PlxyXG4gICAgICAgICAgICB7dGhpcy5wcm9wcy5tZXNzYWdlfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0xheWVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5rZXl1cExpc3RlbmVyID0gdGhpcy5rZXl1cExpc3RlbmVyLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAga2V5dXBMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgaWYgKGUud2hpY2ggPT09IDI3KSB7XHJcbiAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZSh0aGlzLnJlZnMucm9vdC5wYXJlbnROb2RlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCB0aGlzLmtleXVwTGlzdGVuZXIpO1xyXG5cclxuICAgICAgICBjb25zdCB0aGlzTm9kZSA9IERPTS5xdWVyeShgIyR7dGhpcy5wcm9wcy5pZH1gKTtcclxuICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAyMDAsXHJcbiAgICAgICAgICAgIHVwZGF0ZTogZnVuY3Rpb24ocHJvZ3Jlc3MpIHtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IGBzY2FsZSgkezEuMSAtIDAuMSAqIHByb2dyZXNzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIHRoaXNOb2RlLnN0eWxlLm9wYWNpdHkgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMua2V5dXBMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoaXNOb2RlID0gRE9NLnF1ZXJ5KGAjJHt0aGlzLnByb3BzLmlkfWApO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MS4xIC0gMC4xICogKDEgLSBwcm9ncmVzcyl9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IDEgLSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc05vZGUucmVtb3ZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBET00ucXVlcnkoXCIucHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LnJlbW92ZShcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqIHByb2dyZXNzICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJvZ3Jlc3MgPT0gMSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLnRyYW5zZm9ybSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbE1vdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxheWVyID0gRE9NLnF1ZXJ5KFwiW2NsYXNzKj1cXFwibGF5ZXItXFxcIl1cIik7XHJcbiAgICAgICAgbGF5ZXIuY2xhc3NMaXN0LmFkZChcInB1YmxpY1NlcnZlcnNPcGVuXCIpO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MC4wNyAqICgxIC0gcHJvZ3Jlc3MpICsgMC45M30pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS5vcGFjaXR5ID0gMSAtIHByb2dyZXNzO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwibGF5ZXIgYmQtbGF5ZXIgXCIrQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXIgJiYgZS5hbmltYXRpbmcpWzBdLmxheWVyLCBpZDogdGhpcy5wcm9wcy5pZCwgcmVmOiBcInJvb3RcIiwgc3R5bGU6IHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06IFwic2NhbGUoMS4xKSB0cmFuc2xhdGVaKDBweClcIn19LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVG9vbHMgZnJvbSBcIi4uL3Rvb2xzXCI7XHJcbmltcG9ydCBTZXR0aW5nc1RpdGxlIGZyb20gXCIuLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBUYWJCYXJTZXBhcmF0b3IgZnJvbSBcIi4uL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuLi90YWJCYXJIZWFkZXJcIjtcclxuaW1wb3J0IFRhYkJhckl0ZW0gZnJvbSBcIi4uL3RhYkJhckl0ZW1cIjtcclxuXHJcbmltcG9ydCBTZXJ2ZXJDYXJkIGZyb20gXCIuL3NlcnZlckNhcmRcIjtcclxuaW1wb3J0IFNpZGViYXJWaWV3IGZyb20gXCIuL3NpZGViYXJWaWV3XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHVibGljU2VydmVycyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoYW5nZUNhdGVnb3J5ID0gdGhpcy5jaGFuZ2VDYXRlZ29yeS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNlYXJjaEtleURvd24gPSB0aGlzLnNlYXJjaEtleURvd24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbiA9IHRoaXMuY2hlY2tDb25uZWN0aW9uLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5qb2luID0gdGhpcy5qb2luLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ID0gdGhpcy5jb25uZWN0LmJpbmQodGhpcyk7XHJcblxyXG4gICAgICAgIHRoaXMuR3VpbGRTdG9yZSA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRHdWlsZHNcIl0pO1xyXG4gICAgICAgIHRoaXMuQXZhdGFyRGVmYXVsdHMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0VXNlckF2YXRhclVSTFwiLCBcIkRFRkFVTFRfQVZBVEFSU1wiXSk7XHJcbiAgICAgICAgdGhpcy5JbnZpdGVBY3Rpb25zID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImFjY2VwdEludml0ZVwiXSk7XHJcbiAgICAgICAgdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldFNvcnRlZEd1aWxkc1wiXSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5jaGVja0Nvbm5lY3Rpb24oKTtcclxuICAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFN0YXRlKCkge1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IC0xLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlcnZlcnM6IFtdLFxyXG4gICAgICAgICAgICBuZXh0OiBudWxsLFxyXG4gICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogMCxcclxuICAgICAgICAgICAgICAgIHVzZXI6IG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2xvc2UoKSB7XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMucHJvcHMucm9vdElkKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoKHF1ZXJ5LCBjbGVhcikge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGZldGNoKGAke3NlbGYuZW5kUG9pbnR9JHtxdWVyeX0ke3F1ZXJ5ID8gXCImc2NoZW1hPW5ld1wiIDogXCI/c2NoZW1hPW5ld1wifWAsIHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcImdldFwiXHJcbiAgICAgICAgfSkudGhlbihhc3luYyByZXMgPT4ge1xyXG4gICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApdGhyb3cgYXdhaXQgcmVzLnRleHQoKVxyXG4gICAgICAgICAgICBsZXQgZGF0YSA9IGF3YWl0IHJlcy5qc29uKClcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCBzZXJ2ZXJzID0gZGF0YS5yZXN1bHRzLnJlZHVjZSgoYXJyLCBzZXJ2ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcnZlci5qb2luZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGFyci5wdXNoKHNlcnZlcik7XHJcbiAgICAgICAgICAgICAgICAvLyBhcnIucHVzaCg8U2VydmVyQ2FyZCBzZXJ2ZXI9e3NlcnZlcn0gam9pbj17c2VsZi5qb2lufS8+KTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhcnI7XHJcbiAgICAgICAgICAgIH0sIFtdKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghY2xlYXIpIHtcclxuICAgICAgICAgICAgICAgIHNlcnZlcnMgPSBzZWxmLnN0YXRlLnNlcnZlcnMuY29uY2F0KHNlcnZlcnMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy9zZXJ2ZXJzLnVuc2hpZnQoc2VsZi5iZFNlcnZlcik7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBlbmQgPSBkYXRhLnNpemUgKyBkYXRhLmZyb207XHJcbiAgICAgICAgICAgIGRhdGEubmV4dCA9IGA/ZnJvbT0ke2VuZH1gO1xyXG4gICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS50ZXJtKSBkYXRhLm5leHQgKz0gYCZ0ZXJtPSR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkpIGRhdGEubmV4dCArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgICAgICBpZiAoZW5kID49IGRhdGEudG90YWwpIHtcclxuICAgICAgICAgICAgICAgIGVuZCA9IGRhdGEudG90YWw7XHJcbiAgICAgICAgICAgICAgICBkYXRhLm5leHQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBgU2hvd2luZyAxLSR7ZW5kfSBvZiAke2RhdGEudG90YWx9IHJlc3VsdHMgaW4gJHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIHRpdGxlICs9IGAgZm9yICR7c2VsZi5zdGF0ZS50ZXJtfWA7XHJcblxyXG4gICAgICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxyXG4gICAgICAgICAgICAgICAgc2VydmVyczogc2VydmVycyxcclxuICAgICAgICAgICAgICAgIG5leHQ6IGRhdGEubmV4dFxyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmIChjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhzZWxmKTtcclxuICAgICAgICAgICAgICAgIHNlbGYucmVmcy5zYnYucmVmcy5jb250ZW50U2Nyb2xsZXIuc2Nyb2xsVG9wID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgIHJldHVybiBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiRmFpbGVkIHRvIGxvYWQgc2VydmVycy4gQ2hlY2sgY29uc29sZSBmb3IgZGV0YWlsc1wiXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgam9pbihzZXJ2ZXJDYXJkKSB7XHJcbiAgICAgICAgaWYgKHNlcnZlckNhcmQucHJvcHMucGlubmVkKSByZXR1cm4gdGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZShzZXJ2ZXJDYXJkLnByb3BzLmludml0ZV9jb2RlKTtcclxuXHJcbiAgICAgICAgYXdhaXQgZmV0Y2goYCR7dGhpcy5qb2luRW5kUG9pbnR9LyR7c2VydmVyQ2FyZC5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcn1gLHtcclxuICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgIG1vZGU6IFwiY29yc1wiLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc2VydmVyQ2FyZC5zZXRTdGF0ZSh7am9pbmVkOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29ubmVjdCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcHRpb25zID0gc2VsZi53aW5kb3dPcHRpb25zO1xyXG4gICAgICAgIG9wdGlvbnMueCA9IE1hdGgucm91bmQod2luZG93LnNjcmVlblggKyB3aW5kb3cuaW5uZXJXaWR0aCAvIDIgLSBvcHRpb25zLndpZHRoIC8gMik7XHJcbiAgICAgICAgb3B0aW9ucy55ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWSArIHdpbmRvdy5pbm5lckhlaWdodCAvIDIgLSBvcHRpb25zLmhlaWdodCAvIDIpO1xyXG5cclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cgPSBuZXcgKHdpbmRvdy5yZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLkJyb3dzZXJXaW5kb3cpKG9wdGlvbnMpO1xyXG4gICAgICAgIGNvbnN0IHVybCA9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0P3Njb3Blcz1ndWlsZHMuam9pbiZwcmV2aW91c1VybD1odHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2luZm9cIjtcclxuICAgICAgICBzZWxmLmpvaW5XaW5kb3cud2ViQ29udGVudHMub24oXCJkaWQtbmF2aWdhdGVcIiwgKGV2ZW50LCB1cmwpID0+IHtcclxuICAgICAgICAgICAgaWYgKHVybCAhPSBcImh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiKSByZXR1cm47XHJcbiAgICAgICAgICAgIHNlbGYuam9pbldpbmRvdy5jbG9zZSgpO1xyXG4gICAgICAgICAgICBzZWxmLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy5sb2FkVVJMKHVybCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHdpbmRvd09wdGlvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgd2lkdGg6IDUwMCxcclxuICAgICAgICAgICAgaGVpZ2h0OiA1NTAsXHJcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjMjgyYjMwXCIsXHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIG1heGltaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWluaW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBhbHdheXNPblRvcDogdHJ1ZSxcclxuICAgICAgICAgICAgZnJhbWU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxyXG4gICAgICAgICAgICB3ZWJQcmVmZXJlbmNlczoge1xyXG4gICAgICAgICAgICAgICAgbm9kZUludGVncmF0aW9uOiBmYWxzZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgYmRTZXJ2ZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VydmVyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkJldHRlckRpc2NvcmRcIixcclxuICAgICAgICAgICAgb25saW5lOiBcIjc1MDArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiMjAwMDArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgQmV0dGVyRGlzY29yZCBzZXJ2ZXIgZm9yIHN1cHBvcnQgZXRjXCIsXHJcbiAgICAgICAgICAgIGlkZW50aWZpZXI6IFwiODYwMDQ3NDQ5NjY5MTQwNDhcIixcclxuICAgICAgICAgICAgaWNvblVybDogXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9pY29ucy84NjAwNDc0NDk2NjkxNDA0OC8yOTJlN2Y2YmZmZjJiNzFkZmQxM2U1MDhhODU5YWVkZC53ZWJwXCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjBUbWZvNVpiT1JDUnFiQWRcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBzZXJ2ZXIyID0ge1xyXG4gICAgICAgICAgICBuYW1lOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBvbmxpbmU6IFwiMzArXCIsXHJcbiAgICAgICAgICAgIG1lbWJlcnM6IFwiNTArXCIsXHJcbiAgICAgICAgICAgIGNhdGVnb3JpZXM6IFtcImNvbW11bml0eVwiLCBcInByb2dyYW1taW5nXCIsIFwic3VwcG9ydFwiXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFwiT2ZmaWNpYWwgTGlnaHRjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzcwNTkwODM1MDIxODY2NjExNy8wNWE1NjUyZjdkMWQwYWUzMjhjYTdkNmUyMzU0YTgyYS53ZWJwXCIsXHJcbiAgICAgICAgICAgIG5hdGl2ZWpvaW46IHRydWUsXHJcbiAgICAgICAgICAgIGludml0ZV9jb2RlOiBcIjdlRmZmMkFcIixcclxuICAgICAgICAgICAgcGlubmVkOiB0cnVlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7c2VydmVyOiBzZXJ2ZXIyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlciwgcGlubmVkOiB0cnVlLCBqb2luOiB0aGlzLmpvaW4sIGd1aWxkTGlzdDogZ3VpbGRMaXN0LCBmYWxsYmFjazogZGVmYXVsdExpc3RbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNSldfSlcclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVuZFBvaW50KCkge1xyXG4gICAgICAgIHJldHVybiBcImh0dHBzOi8vc2VhcmNoLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBqb2luRW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qLmRpc2NvcmRzZXJ2ZXJzLmNvbVwiO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0RW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9qb2luLmRpc2NvcmRzZXJ2ZXJzLmNvbS9jb25uZWN0XCI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY2hlY2tDb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb2Ase1xyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxyXG4gICAgICAgICAgICAgICAgY3JlZGVudGlhbHM6IFwiaW5jbHVkZVwiLFxyXG4gICAgICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgXCJBY2NlcHRcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogMCxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMixcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBkYXRhXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBzZWxmLnNlYXJjaChcIlwiLCB0cnVlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgdGl0bGU6IFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhdGU6IDEsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2lkZWJhclZpZXcsIHtyZWY6IFwic2J2XCJ9LCB0aGlzLmNvbXBvbmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBzaWRlYmFyOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuc2lkZWJhclxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBjb250ZW50OiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHRoaXMuY29udGVudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB0b29sczoge1xyXG4gICAgICAgICAgICAgICAgY29tcG9uZW50OiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHMsIHtrZXk6IFwicHRcIiwgcmVmOiBcInRvb2xzXCIsIG9uQ2xpY2s6IHRoaXMuY2xvc2V9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2lkZWJhcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJcIiwga2V5OiBcInBzXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyIFNJREVcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCIsIHN0eWxlOiB7Zm9udFNpemU6IFwiMTZweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgXCJQdWJsaWMgU2VydmVyc1wiXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaElucHV0LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySGVhZGVyLCB7dGV4dDogXCJDYXRlZ29yaWVzXCJ9KSxcclxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlCdXR0b25zLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJJdGVtLCB7aWQ6IGluZGV4LCBvbkNsaWNrOiB0aGlzLmNoYW5nZUNhdGVnb3J5LCBrZXk6IGluZGV4LCB0ZXh0OiB2YWx1ZSwgc2VsZWN0ZWQ6IHRoaXMuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSA9PT0gaW5kZXh9KTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlcixcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VhcmNoSW5wdXQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLWl0ZW1cIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRleHQtaW5wdXQgZmxleC12ZXJ0aWNhbFwiLCBzdHlsZToge3dpZHRoOiBcIjE3MnB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiLCB7cmVmOiBcInNlYXJjaGlucHV0XCIsIG9uS2V5RG93bjogdGhpcy5zZWFyY2hLZXlEb3duLCBvbkNoYW5nZTogKCkgPT4ge30sIHR5cGU6IFwidGV4dFwiLCBjbGFzc05hbWU6IFwiaW5wdXQgZGVmYXVsdFwiLCBwbGFjZWhvbGRlcjogXCJTZWFyY2guLi5cIiwgbWF4TGVuZ3RoOiBcIjUwXCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2hLZXlEb3duKGUpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nIHx8IGUud2hpY2ggIT09IDEzKSByZXR1cm47XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgdGVybTogZS50YXJnZXQudmFsdWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBsZXQgcXVlcnkgPSBgP3Rlcm09JHtlLnRhcmdldC52YWx1ZX1gO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnkgIT09IDApIHtcclxuICAgICAgICAgICAgcXVlcnkgKz0gYCZjYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2gocXVlcnksIHRydWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYXRlZ29yeUJ1dHRvbnMoKSB7XHJcbiAgICAgICAgcmV0dXJuIFtcIkFsbFwiLCBcIkZQUyBHYW1lc1wiLCBcIk1NTyBHYW1lc1wiLCBcIlN0cmF0ZWd5IEdhbWVzXCIsIFwiTU9CQSBHYW1lc1wiLCBcIlJQRyBHYW1lc1wiLCBcIlRhYmxldG9wIEdhbWVzXCIsIFwiU2FuZGJveCBHYW1lc1wiLCBcIlNpbXVsYXRpb24gR2FtZXNcIiwgXCJNdXNpY1wiLCBcIkNvbW11bml0eVwiLCBcIkxhbmd1YWdlXCIsIFwiUHJvZ3JhbW1pbmdcIiwgXCJPdGhlclwiXTtcclxuICAgIH1cclxuXHJcbiAgICBjaGFuZ2VDYXRlZ29yeShpZCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcpIHJldHVybjtcclxuICAgICAgICBzZWxmLnJlZnMuc2VhcmNoaW5wdXQudmFsdWUgPSBcIlwiO1xyXG4gICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBsb2FkaW5nOiB0cnVlLFxyXG4gICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiBpZCxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBudWxsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKGlkID09PSAwKSB7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbGYuc2VhcmNoKGA/Y2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tpZF19YCwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbnRlbnQoKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgY29uc3QgZ3VpbGRMaXN0ID0gdGhpcy5Tb3J0ZWRHdWlsZFN0b3JlLmdldEZsYXR0ZW5lZEd1aWxkSWRzKCk7XHJcbiAgICAgICAgY29uc3QgZGVmYXVsdExpc3QgPSB0aGlzLkF2YXRhckRlZmF1bHRzLkRFRkFVTFRfQVZBVEFSUztcclxuICAgICAgICBpZiAoc2VsZi5zdGF0ZS5jb25uZWN0aW9uLnN0YXRlID09PSAxKSByZXR1cm4gc2VsZi5ub3RDb25uZWN0ZWQ7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7cmVmOiBcImNvbnRlbnRcIiwga2V5OiBcInBjXCIsIGNsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSksXHJcbiAgICAgICAgICAgIHNlbGYuYmRTZXJ2ZXIsXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5tYXAoKHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXJ2ZXJDYXJkLCB7a2V5OiBzZXJ2ZXIuaWRlbnRpZmllciwgc2VydmVyOiBzZXJ2ZXIsIGpvaW46IHNlbGYuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUubmV4dCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO3NlbGYuc2V0U3RhdGUoe2xvYWRpbmc6IHRydWV9KTsgc2VsZi5zZWFyY2goc2VsZi5zdGF0ZS5uZXh0LCBmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLCBzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWFyZ2luVG9wOiBcIjEwcHhcIiwgbWFyZ2luQm90dG9tOiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZS5sb2FkaW5nID8gXCJMb2FkaW5nXCIgOiBcIkxvYWQgTW9yZVwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIHNlbGYuc3RhdGUuc2VydmVycy5sZW5ndGggPiAwICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogc2VsZi5zdGF0ZS50aXRsZX0pXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5vdENvbm5lY3RlZCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICAvL3JldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwgeyB0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlIH0pO1xyXG4gICAgICAgIGxldCBjb2x1bW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uRGVmYXVsdClbMF1cclxuICAgICAgICByZXR1cm4gW0JEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJuY2NcIiwgcmVmOiBcImNvbnRlbnRcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImgyXCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sXHJcbiAgICAgICAgICAgICAgICBcIk5vdCBjb25uZWN0ZWQgdG8gZGlzY29yZHNlcnZlcnMuY29tIVwiLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBzZWxmLmNvbm5lY3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IFwiMThweFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luTGVmdDogXCIxMHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0OiBcIjE0cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNvbm5lY3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSwgc2VsZi5iZFNlcnZlclxyXG4gICAgICAgICldO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJhXCIsXHJcbiAgICAgICAgICAgICAgICB7aHJlZjogXCJodHRwczovL2Rpc2NvcmRzZXJ2ZXJzLmNvbVwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgXCJEaXNjb3Jkc2VydmVycy5jb21cIlxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29ubmVjdGlvbigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCB7Y29ubmVjdGlvbn0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIGlmIChjb25uZWN0aW9uLnN0YXRlICE9PSAyKSByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge2NvbG9yOiBcIiNiOWJiYmVcIiwgZm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgXCJDb25uZWN0ZWQgYXM6IFwiLFxyXG4gICAgICAgICAgICAgICAgYCR7Y29ubmVjdGlvbi51c2VyLnVzZXJuYW1lfSMke2Nvbm5lY3Rpb24udXNlci5kaXNjcmltaW5hdG9yfWBcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtzdHlsZToge3BhZGRpbmc6IFwiNXB4IDEwcHggMCAxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtzdHlsZToge3dpZHRoOiBcIjEwMCVcIiwgbWluSGVpZ2h0OiBcIjIwcHhcIn0sIHR5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJ1aS1idXR0b24gZmlsbGVkIGJyYW5kIHNtYWxsIGdyb3dcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wiLCBvbkNsaWNrOiBzZWxmLmNvbm5lY3R9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlJlY29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxufVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXJ2ZXJDYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBpZiAoIXRoaXMucHJvcHMuc2VydmVyLmljb25VcmwpIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGltYWdlRXJyb3I6IGZhbHNlLFxyXG4gICAgICAgICAgICBqb2luZWQ6IHRoaXMucHJvcHMuZ3VpbGRMaXN0LmluY2x1ZGVzKHRoaXMucHJvcHMuc2VydmVyLmlkZW50aWZpZXIpXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NlcnZlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGxldCBjYXJkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2FyZCAmJiBlLmNhcmRQcmltYXJ5KVswXVxyXG4gICAgICAgIGxldCBmbGV4TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxleENoaWxkICYmIGUuX2hvcml6b250YWxSZXZlcnNlKVswXVxyXG4gICAgICAgIGxldCB3cmFwTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubm9XcmFwICYmICFlLnN0cmVhbWVyTW9kZUVuYWJsZWQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwgLy8gY2FyZFByaW1hcnktMUh2LXRvXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGAke2NhcmRNb2R1bGUuY2FyZH0gJHtjYXJkTW9kdWxlLmNhcmRQcmltYXJ5fSAke0JETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTgpWzBdLm1hcmdpbkJvdHRvbTh9IGJkLXNlcnZlci1jYXJkJHtzZXJ2ZXIucGlubmVkID8gXCIgYmQtc2VydmVyLWNhcmQtcGlubmVkXCIgOiBcIlwifWB9LFxyXG4gICAgICAgICAgICAvLyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAvLyBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgLy8geyBjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZmxleC0xTzFHS1kgZGlyZWN0aW9uUm93LTN2M3RmRyBqdXN0aWZ5U3RhcnQtMnlJWm8wIGFsaWduU3RyZXRjaC0xaHd4TWEgbm9XcmFwLTNqeW52NlwiIH0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiwge3JlZjogXCJpbWdcIiwgY2xhc3NOYW1lOiBcImJkLXNlcnZlci1pbWFnZVwiLCBzcmM6IHNlcnZlci5pY29uVXJsLCBvbkVycm9yOiB0aGlzLmhhbmRsZUVycm9yLmJpbmQodGhpcyl9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IGZsZXhNb2R1bGUuZmxleENoaWxkK1wiIGJkLXNlcnZlci1jb250ZW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwK1wiIGJkLXNlcnZlci1oZWFkZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiaDVcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiaDUtMThfMW5kIGRlZmF1bHRDb2xvci0xX2FqWDAgbWFyZ2luLXJlc2V0IGJkLXNlcnZlci1uYW1lXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW1lbWJlci1jb3VudFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5tZW1iZXJzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgTWVtYmVyc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5ob3Jpem9udGFsK1wiIFwiK3dyYXBNb2R1bGUubm9XcmFwfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdEhhaXJsaW5lLURCRC0yZCBzY3JvbGxlckZhZGUtMUlqdzV5IGJkLXNlcnZlci1kZXNjcmlwdGlvbi1jb250YWluZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBzY3JvbGxlciBiZC1zZXJ2ZXItZGVzY3JpcHRpb25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5kZXNjcmlwdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleC0xeE1RZzUgZmxleC0xTzFHS1kgaG9yaXpvbnRhbC0xYWU5Y2kgaG9yaXpvbnRhbC0yRUVFblkgZGlyZWN0aW9uUm93LTN2M3RmRyBub1dyYXAtM2p5bnY2IGJkLXNlcnZlci1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImZsZXhDaGlsZC1mYW9WVzMgYmQtc2VydmVyLXRhZ3NcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jYXRlZ29yaWVzLmpvaW4oXCIsIFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLmpvaW5lZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGNvbG9yR3JlZW4tMjlpQUtZXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiIzNhYzE1Y1wifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci5lcnJvciAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3R5cGU6IFwiYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJidXR0b24tMzhhU2NyIGxvb2tGaWxsZWQtMUd4MDBQIGNvbG9yQnJhbmQtM3BYcjkxIHNpemVNaW4tMW1KZDF4IGdyb3ctcTc3T05OIGRpc2FibGVkLTlhRjJ1Z1wiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIiwgYmFja2dyb3VuZENvbG9yOiBcIiNjMTNhM2FcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJFcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICFzZXJ2ZXIuZXJyb3IgJiYgIXRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk5cIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCJ9LCBvbkNsaWNrOiAoKSA9PiB7dGhpcy5qb2luKCk7fX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkpvaW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAvLyApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVFcnJvcigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLnNlcnZlci5pY29uVXJsID0gdGhpcy5wcm9wcy5mYWxsYmFjaztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbWFnZUVycm9yOiB0cnVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgam9pbigpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmpvaW4odGhpcyk7XHJcbiAgICAgICAgLy90aGlzLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2Nyb2xsZXIgZnJvbSBcIi4uL3Njcm9sbGVyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZWJhclZpZXcgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3NpZGViYXIsIGNvbnRlbnQsIHRvb2xzfSA9IHRoaXMucHJvcHMuY2hpbGRyZW47XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzdGFuZGFyZFNpZGViYXJWaWV3LTNGMUk3aSB1aS1zdGFuZGFyZC1zaWRlYmFyLXZpZXdcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInNpZGViYXJSZWdpb24tVkZUVWtOIHNpZGViYXItcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNjcm9sbGVyLCB7a2V5OiBcInNpZGViYXJTY3JvbGxlclwiLCByZWY6IFwic2lkZWJhclNjcm9sbGVyXCIsIHNpZGViYXI6IHRydWUsIGZhZGU6IHNpZGViYXIuZmFkZSB8fCB0cnVlLCBkYXJrOiBzaWRlYmFyLmRhcmsgfHwgdHJ1ZX0sIHNpZGViYXIuY29tcG9uZW50KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50UmVnaW9uLTNuRHVZeSBjb250ZW50LXJlZ2lvblwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRUcmFuc2l0aW9uV3JhcC0zaHFPRVcgY29udGVudC10cmFuc2l0aW9uLXdyYXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXJXcmFwLTJsSkVrZCBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcC0zWVpYZG0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCBzY3JvbGxlclRoZW1lZC0yb2VudXMgdGhlbWVHaG9zdC0yOE1TbjAgc2Nyb2xsZXJUcmFjay0xWklwc3ZcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInNjcm9sbGVyLTJGS0ZQRyBmaXJlZm94Rml4U2Nyb2xsRmxleC1jbkkyaXggY29udGVudFJlZ2lvblNjcm9sbGVyLTI2bmMxZSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlciBzY3JvbGxlclwiLCByZWY6IFwiY29udGVudFNjcm9sbGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudENvbHVtbi0yaHJJWUggY29udGVudENvbHVtbkRlZmF1bHQtMVZRa0dNIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sIGNvbnRlbnQuY29tcG9uZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xzLmNvbXBvbmVudFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUmVsb2FkSWNvbiBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xyXG4gICAgICAgICAgICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcclxuICAgICAgICAgICAgICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXHJcbiAgICAgICAgICAgICAgICBmaWxsOiBcIiNkY2RkZGVcIixcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJiZC1yZWxvYWQgXCIgKyB0aGlzLnByb3BzLmNsYXNzTmFtZSxcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHRoaXMucHJvcHMub25DbGljayxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7d2lkdGg6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIiwgaGVpZ2h0OiB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCJ9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1elwifSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6IFwibm9uZVwiLCBkOiBcIk0wIDBoMjR2MjRIMHpcIn0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2Nyb2xsZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgLy9zY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXlcclxuICAgICAgICBsZXQgc2Nyb2xsZXJNb2R1bGUxID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXJIb3Jpem9udGFsKVswXVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaWRlYmFyUmVnaW9uU2Nyb2xsZXIpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0SGFpcmxpbmV9JHt0aGlzLnByb3BzLmZhZGUgPyBcIiBcIitzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJGYWRlIDogXCJcIn1gO1xyXG4gICAgICAgIGxldCBzY3JvbGxlckNsYXNzID0gc2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyK1wiIHNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnVjayAqL1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLnNpZGViYXIpIHNjcm9sbGVyQ2xhc3MgKz0gYCAke3Njcm9sbGVyTW9kdWxlMi5zaWRlYmFyUmVnaW9uU2Nyb2xsZXJ9IHNpZGViYXItcmVnaW9uLXNjcm9sbGVyYFxyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLmNvbnRlbnRDb2x1bW4pIHtcclxuICAgICAgICAgICAgc2Nyb2xsZXJDbGFzcyArPSBcIiBcIitzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyK1wiIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyXCI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgICAgIHdyYXBwZXJDbGFzcyA9IGAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlcldyYXB9ICR7c2Nyb2xsZXJNb2R1bGUyLmNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXB9IGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyLXdyYXAgICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVGhlbWVkfSAke3Njcm9sbGVyTW9kdWxlMS50aGVtZUdob3N0fSAke3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlclRyYWNrfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJ3cmFwXCIsIGNsYXNzTmFtZTogd3JhcHBlckNsYXNzfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtrZXk6IFwic2Nyb2xsZXJcIiwgcmVmOiBcInNjcm9sbGVyXCIsIGNsYXNzTmFtZTogc2Nyb2xsZXJDbGFzc30sXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlblxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIiwge2NsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc2VjdGlvbnMubWFwKHNlY3Rpb24gPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc0dyb3VwLCBPYmplY3QuYXNzaWduKHt9LCBzZWN0aW9uLCB7b25DaGFuZ2U6IHRoaXMucHJvcHMub25DaGFuZ2V9KSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL3N3aXRjaFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzR3JvdXAgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3RpdGxlLCBzZXR0aW5ncywgYnV0dG9ufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiB0aXRsZX0pLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICAgICAgfSldO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vc3dpdGNoXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7c2V0dGluZ3N9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW4rXCIgXCIrY29sdW1uTW9kdWxlLmNvbnRlbnRDb2x1bW5EZWZhdWx0K1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogdGhpcy5wcm9wcy50aXRsZX0pLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmJ1dHRvbiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge2tleTogXCJ0aXRsZS1idXR0b25cIiwgY2xhc3NOYW1lOiBcImJkLXBmYnRuXCIsIG9uQ2xpY2s6IHRoaXMucHJvcHMuYnV0dG9uLm9uQ2xpY2t9LCB0aGlzLnByb3BzLmJ1dHRvbi50aXRsZSksXHJcbiAgICAgICAgICAgIHNldHRpbmdzLm1hcChzZXR0aW5nID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzVGl0bGUgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG4vL2gyLTJnV0UtbyB0aXRsZS0zc1pXWVEgc2l6ZTE2LTE0Y0d6NSBoZWlnaHQyMC1tTzJlSU4gd2VpZ2h0U2VtaUJvbGQtTkpleHppIGRhLWgyIGRhLXRpdGxlIGRhLXNpemUxNiBkYS1oZWlnaHQyMCBkYS13ZWlnaHRTZW1pQm9sZCBkZWZhdWx0Q29sb3ItMV9halgwIGRhLWRlZmF1bHRDb2xvciBtYXJnaW5Ub3A2MC0zUEdidEsgZGEtbWFyZ2luVG9wNjAgbWFyZ2luQm90dG9tMjAtMzJxSUQ3IGRhLW1hcmdpbkJvdHRvbTIwXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJoMlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjAgXCIrQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luVG9wNjApWzBdLm1hcmdpblRvcDYwfSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgVGFiQmFyU2VwYXJhdG9yIGZyb20gXCIuL3RhYkJhclNlcGFyYXRvclwiO1xyXG5pbXBvcnQgVGFiQmFySGVhZGVyIGZyb20gXCIuL3RhYkJhckhlYWRlclwiO1xyXG5pbXBvcnQgVGFiQmFySXRlbSBmcm9tIFwiLi90YWJCYXJJdGVtXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2lkZUJhciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGNvbnN0IHNpID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltjbGFzcyo9c2lkZS1dID4gW2NsYXNzKj1zZWxlY3RlZF1cIik7XHJcbiAgICAgICAgaWYgKHNpKSB0aGlzLnNjbiA9IHNpLmNsYXNzTmFtZTtcclxuICAgICAgICBjb25zdCBucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJbY2xhc3MqPXNpZGUtXSA+IFtjbGFzcyo9J2l0ZW0tJ106bm90KFtjbGFzcyo9c2VsZWN0ZWRdKVwiKTtcclxuICAgICAgICBpZiAobnMpIHRoaXMubnNjbiA9IG5zLmNsYXNzTmFtZTtcclxuICAgICAgICBjb25zdCB0YWJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltjbGFzcyo9J3NpZGUtJ10gPiBbY2xhc3MqPSdpdGVtLSddXCIpO1xyXG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiB0YWJzKSB7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHRoaXMuc2V0SW5pdGlhbFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRTZWxlY3RlZCA9IHRoaXMuc2V0U2VsZWN0ZWQuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgc2lkZWJhcnMucHVzaCh0aGlzKVxyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogbnVsbCxcclxuICAgICAgICAgICAgaXRlbXM6IHNlbGYucHJvcHMuaXRlbXNcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uID0gc2VsZi5wcm9wcy5pdGVtcy5maW5kKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gaXRlbS5zZWxlY3RlZDtcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaW5pdGlhbFNlbGVjdGlvbikge1xyXG4gICAgICAgICAgICBzZWxmLnN0YXRlLnNlbGVjdGVkID0gaW5pdGlhbFNlbGVjdGlvbi5pZDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IHtoZWFkZXJUZXh0fSA9IHNlbGYucHJvcHM7XHJcbiAgICAgICAgY29uc3Qge2l0ZW1zLCBzZWxlY3RlZH0gPSBzZWxmLnN0YXRlO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJTZXBhcmF0b3IsIG51bGwpLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySGVhZGVyLCB7dGV4dDogaGVhZGVyVGV4dCwgYnV0dG9uOiB0aGlzLnByb3BzLmhlYWRlckJ1dHRvbn0pLFxyXG4gICAgICAgICAgICBpdGVtcy5tYXAoaXRlbSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7aWQsIHRleHR9ID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFySXRlbSwge2tleTogaWQsIHNlbGVjdGVkOiBzZWxlY3RlZCA9PT0gaWQsIHRleHQ6IHRleHQsIGlkOiBpZCwgb25DbGljazogc2VsZi5vbkNsaWNrfSk7XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTZWxlY3RlZChlKSB7XHJcbiAgICAgICAgZS50YXJnZXQuY2xhc3NOYW1lID0gdGhpcy5zY247XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljayhpZCkge1xyXG4gICAgICAgIGNvbnN0IHNpID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIltjbGFzcyo9c2lkZV0gPiBbY2xhc3MqPXNlbGVjdGVkXVwiKTtcclxuICAgICAgICBpZiAoc2kpIHtcclxuICAgICAgICAgICAgc2kucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMuc2V0U2VsZWN0ZWQpO1xyXG4gICAgICAgICAgICBzaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5zZXRTZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIHNpLmNsYXNzTmFtZSA9IHRoaXMubnNjbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldFVuc2VsZWN0ZWQoKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NlbGVjdGVkOiBpZH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB0aGlzLnByb3BzLm9uQ2xpY2soaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XHJcbiAgICAgICAgbGV0IHNpZGViYXJJbmRleCA9IHNpZGViYXJzLmZpbmRJbmRleChlID0+IGUgPT09IHRoaXMpXHJcbiAgICAgICAgaWYoc2lkZWJhckluZGV4KXNpZGViYXJzLnNwbGljZShzaWRlYmFySW5kZXgsIDEpXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IHNpZGViYXJzID0gW11cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRVbnNlbGVjdGVkKCl7XHJcbiAgICBzaWRlYmFycy5mb3JFYWNoKChzaWRlYmFyKSA9PiB7XHJcbiAgICAgICAgaWYoIXNpZGViYXIuc3RhdGUuc2VsZWN0ZWQpcmV0dXJuXHJcbiAgICAgICAgc2lkZWJhci5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkOiBudWxsXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL2NvbXBvbmVudHMvc3dpdGNoXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2hJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSgpIHtcclxuICAgICAgICB0aGlzLnByb3BzLmNoZWNrZWQgPSAhdGhpcy5wcm9wcy5jaGVja2VkO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgdGhpcy5wcm9wcy5jaGVja2VkKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3RleHQsIGluZm99ID0gdGhpcy5wcm9wcy5kYXRhO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtdmVydGljYWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcCB1aS1zd2l0Y2gtaXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktZmxleCBmbGV4LWhvcml6b250YWwgZmxleC1qdXN0aWZ5LXN0YXJ0IGZsZXgtYWxpZ24tc3RyZXRjaCBmbGV4LW5vd3JhcFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgzXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMyBtYXJnaW4tcmVzZXQgbWFyZ2luLXJlc2V0IHVpLWZsZXgtY2hpbGRcIn0sIHRleHQpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge29uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLCBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9KVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRleHQgc3R5bGUtZGVzY3JpcHRpb24gbWFyZ2luLXRvcC00XCIsIHN0eWxlOiB7ZmxleDogXCIxIDEgYXV0b1wifX0sIGluZm8pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFySGVhZGVyIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIn0sIHRoaXMucHJvcHMudGV4dCwgdGhpcy5wcm9wcy5idXR0b24pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJJdGVtIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHRoaXMucHJvcHMuc2VsZWN0ZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBgdWktdGFiLWJhci1pdGVtJHt0aGlzLnByb3BzLnNlbGVjdGVkID8gXCIgc2VsZWN0ZWRcIiA6IFwiXCJ9YCwgb25DbGljazogdGhpcy5vbkNsaWNrfSxcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy50ZXh0XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnByb3BzLm9uQ2xpY2spIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNsaWNrKHRoaXMucHJvcHMuaWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfVGFiQmFyU2VwYXJhdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItc2VwYXJhdG9yIG1hcmdpbi10b3AtOCBtYXJnaW4tYm90dG9tLThcIn0pO1xyXG4gICAgfVxyXG59IiwiXCJ1c2Ugc3RyaWN0XCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCJcclxuY29uc3QgUmVhY3QgPSBCRFYyLnJlYWN0XHJcblxyXG5jb25zdCBpbnRlcnZhbE1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5JbnRlcnZhbClbMF1cclxuXHJcblxyXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbihjb21wb25lbnQsIE1lc3NhZ2VzKSB7XHJcbiAgICBjbGFzcyBUaW1lUmVuZGVyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICAgICAgY29uc3RydWN0b3IocHJvcHMpe1xyXG4gICAgICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICAgICAgdGhpcy5faW50ZXJ2YWwgPSBuZXcgaW50ZXJ2YWxNb2R1bGUxLkludGVydmFsKClcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmdldFVwZGF0ZWRUaW1lKCkpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb21wb25lbnREaWRNb3VudCgpe1xyXG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsLnN0YXJ0KDFlMywgKGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0U3RhdGUoc2VsZi5nZXRVcGRhdGVkVGltZSgpKVxyXG4gICAgICAgICAgICB9KSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCl7XHJcbiAgICAgICAgICAgIHRoaXMuX2ludGVydmFsLnN0b3AoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29tcG9uZW50RGlkVXBkYXRlKGFjdGl2aXR5KXtcclxuICAgICAgICAgICAgaWYoYWN0aXZpdHkudGltZXN0YW1wcy5lbmQgPT09IHRoaXMucHJvcHMudGltZXN0YW1wcy5lbmQgJiYgYWN0aXZpdHkudGltZXN0YW1wcy5zdGFydCA9PT0gdGhpcy5wcm9wcy50aW1lc3RhbXBzLnN0YXJ0KXJldHVyblxyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHRoaXMuZ2V0VXBkYXRlZFRpbWUoKSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldFVwZGF0ZWRUaW1lKCl7XHJcbiAgICAgICAgICAgIGxldCB0aW1lc3RhbXBzID0gdGhpcy5wcm9wcy50aW1lc3RhbXBzXHJcbiAgICAgICAgICAgIGxldCBub3cgPSBEYXRlLm5vdygpIC8gMWUzO1xyXG4gICAgICAgICAgICBpZihudWxsICE9IHRpbWVzdGFtcHMuZW5kKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldERpZmYobm93LCBjaGVja1VuaXgodGltZXN0YW1wcy5lbmQpIC8gMWUzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKG51bGwgIT0gdGltZXN0YW1wcy5zdGFydCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREaWZmKGNoZWNrVW5peCh0aW1lc3RhbXBzLnN0YXJ0KSAvIDFlMywgbm93KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogMCxcclxuICAgICAgICAgICAgICAgIG1pbnV0ZXM6IDAsXHJcbiAgICAgICAgICAgICAgICBzZWNvbmRzOiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlbmRlclRpbWUobnVtYmVyLCByZW1vdmVaZXJvKXtcclxuICAgICAgICAgICAgaWYocmVtb3ZlWmVybyA9PT0gdW5kZWZpbmVkKXJlbW92ZVplcm8gPSBmYWxzZVxyXG4gICAgICAgICAgICBpZihyZW1vdmVaZXJvICYmIG51bWJlciA8PSAwKXJldHVybiAtMVxyXG4gICAgICAgICAgICBpZihudW1iZXIgPCAxMClyZXR1cm4gXCIwXCIrbnVtYmVyXHJcbiAgICAgICAgICAgIHJldHVybiBudW1iZXJcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldERpZmYodGltZXN0YW1wLCBub3cpe1xyXG4gICAgICAgICAgICBsZXQgaG91cnMgPSBNYXRoLm1heChub3cgLSB0aW1lc3RhbXAsIDApXHJcbiAgICAgICAgICAgIGxldCBzZWNvbmRzID0gTWF0aC5mbG9vcihob3VycykgJSA2MFxyXG4gICAgICAgICAgICBsZXQgbWludXRlcyA9IE1hdGguZmxvb3IoaG91cnMgLyA2MCkgJSA2MFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaG91cnM6IE1hdGguZmxvb3IoaG91cnMgLyAzNjAwKSAlIDI0LFxyXG4gICAgICAgICAgICAgICAgbWludXRlcyxcclxuICAgICAgICAgICAgICAgIHNlY29uZHNcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIGxldCBwcm9wcyA9IHRoaXMucHJvcHNcclxuICAgICAgICAgICAgbGV0IHRpbWVzdGFtcHMgPSBwcm9wcy50aW1lc3RhbXBzXHJcblxyXG4gICAgICAgICAgICBsZXQgdXNlZFByb3BzID0gZnVuY3Rpb24ocHJvcHMsIGl0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBwcm9wcykgcmV0dXJuIHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCB0aW1lc3RhbXBzID0ge31cclxuICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMocHJvcHMpO1xyXG5cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGtleXNbaV1cclxuICAgICAgICAgICAgICAgICAgICBpZighaXRlbXMuaW5kZXhPZihrZXkpID49IDApe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBzW2tleV0gPSBwcm9wc1trZXldXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aW1lc3RhbXBzXHJcbiAgICAgICAgICAgIH0ocHJvcHMsIFtcInRpbWVzdGFtcHNcIl0pXHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlXHJcbiAgICAgICAgICAgIGxldCBob3VycyA9IHN0YXRlLmhvdXJzXHJcbiAgICAgICAgICAgIGxldCBtaW51dGVzID0gc3RhdGUubWludXRlc1xyXG4gICAgICAgICAgICBsZXQgc2Vjb25kcyA9IHN0YXRlLnNlY29uZHNcclxuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XHJcbiAgICAgICAgICAgICAgICBob3VyczogdGhpcy5yZW5kZXJUaW1lKGhvdXJzLCAhMCksXHJcbiAgICAgICAgICAgICAgICBtaW51dGVzOiB0aGlzLnJlbmRlclRpbWUobWludXRlcyksXHJcbiAgICAgICAgICAgICAgICBzZWNvbmRzOiB0aGlzLnJlbmRlclRpbWUoc2Vjb25kcylcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgaWYodGltZXN0YW1wcy5lbmQgIT09IG51bGwpe1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29tcG9uZW50LCBPYmplY3QuYXNzaWduKHt9LCB1c2VkUHJvcHMsIHtcclxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBNZXNzYWdlcy5VU0VSX0FDVElWSVRZX1RJTUVTVEFNUF9FTkQuZm9ybWF0KGRhdGEpXHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aW1lc3RhbXBzLnN0YXJ0ICE9PSBudWxsKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbXBvbmVudCwgT2JqZWN0LmFzc2lnbih7fSwgdXNlZFByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTWVzc2FnZXMuVVNFUl9BQ1RJVklUWV9USU1FU1RBTVBfU1RBUlQuZm9ybWF0KGRhdGEpXHJcbiAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBUaW1lUmVuZGVyXHJcbn07XHJcblxyXG5mdW5jdGlvbiBjaGVja1VuaXgoZSkge1xyXG4gICAgcmV0dXJuIChcIlwiICsgZSkubGVuZ3RoIDwgMTMgPyAxZTMgKiBlIDogZVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBYU3ZnIGZyb20gXCIuL3hTdmdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Ub29scyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgdG9vbHNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS50b29sc0NvbnRhaW5lcilbMF1cclxuICAgICAgICBsZXQgY29udGFpbmVyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGFpbmVyICYmIGUuY2xvc2VCdXR0b24gJiYgZS5jbG9zZUJ1dHRvbkJvbGQpWzBdXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzLWNvbnRhaW5lciBcIit0b29sc01vZHVsZS50b29sc0NvbnRhaW5lcn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInRvb2xzIFwiK3Rvb2xzTW9kdWxlLnRvb2xzfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBjb250YWluZXJNb2R1bGUuY29udGFpbmVyfSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJidG4tY2xvc2UgXCIrY29udGFpbmVyTW9kdWxlLmNsb3NlQnV0dG9uLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJlc2MtdGV4dCBcIitjb250YWluZXJNb2R1bGUua2V5YmluZH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRVNDXCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgY2xvc2VCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLlwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNsb3NlQnV0dG9uICYmIGUua2V5YmluZEJvbGQpWzBdLmNsb3NlQnV0dG9uLnNwbGl0KFwiIFwiKVswXSk7XHJcbiAgICAgICAgaWYgKGNsb3NlQnV0dG9uKSBjbG9zZUJ1dHRvbi5jbGljaygpO1xyXG4gICAgfVxyXG59IiwiLyoqXHJcbiAqIFRvb2x0aXAgdGhhdCBhdXRvbWF0aWNhbGx5IHNob3cgYW5kIGhpZGUgdGhlbXNlbHZlcyBvbiBtb3VzZWVudGVyIGFuZCBtb3VzZWxlYXZlIGV2ZW50cy5cclxuICogV2lsbCBhbHNvIHJlbW92ZSB0aGVtc2VsdmVzIGlmIHRoZSBub2RlIHRvIHdhdGNoIGlzIHJlbW92ZWQgZnJvbSBET00gdGhyb3VnaFxyXG4gKiBhIE11dGF0aW9uT2JzZXJ2ZXIuXHJcbiAqXHJcbiAqIE5vdGUgdGhpcyBpcyBub3QgdXNpbmcgRGlzY29yZCdzIGludGVybmFscyBidXQgbm9ybWFsIERPTSBtYW5pcHVsYXRpb24gYW5kIGVtdWxhdGVzXHJcbiAqIERpc2NvcmQncyBvd24gdG9vbHRpcHMgYXMgY2xvc2VseSBhcyBwb3NzaWJsZS5cclxuICpcclxuICogQG1vZHVsZSBFbXVsYXRlZFRvb2x0aXBcclxuICogQHZlcnNpb24gMC4wLjFcclxuICovXHJcblxyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcblxyXG4vLzxkaXYgY2xhc3M9XCJsYXllci12OUh5WWMgZGlzYWJsZWRQb2ludGVyRXZlbnRzLTFwdGdUQlwiIHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAyMzdweDsgYm90dG9tOiA1MXB4O1wiPlxyXG4vL1x0PGRpdiBjbGFzcz1cInRvb2x0aXAtMlFmTHRjIHRvb2x0aXBUb3AtWEREU3h4IHRvb2x0aXBCbGFjay1QUEc0N3ogdG9vbHRpcERpc2FibGVQb2ludGVyRXZlbnRzLTNlYUJHTlwiIHN0eWxlPVwib3BhY2l0eTogMTsgdHJhbnNmb3JtOiBub25lO1wiPlxyXG4vL1x0XHQ8ZGl2IGNsYXNzPVwidG9vbHRpcFBvaW50ZXItM1pmaXJLXCI+PC9kaXY+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwQ29udGVudC1icVZMV0tcIj5Vc2VyIFNldHRpbmdzPC9kaXY+XHJcbi8vXHQ8L2Rpdj5cclxuLy88L2Rpdj5cclxuXHJcbi8vPGRpdiBjbGFzcz1cImxheWVyLXY5SHlZY1wiIHN0eWxlPVwidG9wOiA4NjBweDsgbGVmdDogNjMyLjVweDtcIj5cclxuLy9cdDxkaXYgY2xhc3M9XCJ0b29sdGlwLTJRZkx0YyB0b29sdGlwQmxhY2stUFBHNDd6IHRvb2x0aXBUb3AtWEREU3h4XCI+XHJcbi8vXHRcdDxkaXYgY2xhc3M9XCJ0b29sdGlwUG9pbnRlci0zWmZpcktcIj48L2Rpdj5cclxuLy9cdFx0Q2hhbmdlbG9nXHJcbi8vXHQ8L2Rpdj5cclxuLy88L2Rpdj5cclxubGV0IFRvb2x0aXBDbGFzc2VzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XHJcblx0aWYoVG9vbHRpcENsYXNzZXMpcmV0dXJuIFRvb2x0aXBDbGFzc2VzXHJcblx0cmV0dXJuIFRvb2x0aXBDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ0b29sdGlwXCIsIFwidG9vbHRpcEJsYWNrXCIpO1xyXG59XHJcbmxldCBUb29sdGlwTGF5ZXJzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBMYXllcnMoKXtcclxuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXHJcblx0cmV0dXJuIFRvb2x0aXBMYXllcnMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImxheWVyXCIsIFwibGF5ZXJDb250YWluZXJcIik7XHJcbn1cclxuXHJcbmNvbnN0IGdldENsYXNzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIGNvbnN0IHVwcGVyQ2FzZSA9IHNpZGVPckNvbG9yWzBdLnRvVXBwZXJDYXNlKCkgKyBzaWRlT3JDb2xvci5zbGljZSgxKTtcclxuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcclxuICAgIGlmICh0b29sdGlwQ2xhc3MpIHJldHVybiB0b29sdGlwQ2xhc3M7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGNsYXNzRXhpc3RzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XHJcbn07XHJcblxyXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZX1weGA7XHJcbn07XHJcblxyXG4vKiA8ZGl2IGNsYXNzPVwibGF5ZXItdjlIeVljIGRhLWxheWVyXCIgc3R5bGU9XCJsZWZ0OiAyMzQuNXB4OyBib3R0b206IDUxcHg7XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidG9vbHRpcC0yUWZMdGMgZGEtdG9vbHRpcCB0b29sdGlwVG9wLVhERFN4eCB0b29sdGlwQmxhY2stUFBHNDd6XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInRvb2x0aXBQb2ludGVyLTNaZmlySyBkYS10b29sdGlwUG9pbnRlclwiPjwvZGl2PlxyXG4gICAgICAgIFVzZXIgU2V0dGluZ3NcclxuICAgIDwvZGl2PlxyXG48L2Rpdj4gKi9cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtdWxhdGVkVG9vbHRpcCB7XHJcblx0LyoqXHJcblx0ICpcclxuXHQgKiBAY29uc3RydWN0b3JcclxuXHQgKiBAcGFyYW0geyhIVE1MRWxlbWVudHxqUXVlcnkpfSBub2RlIC0gRE9NIG5vZGUgdG8gbW9uaXRvciBhbmQgc2hvdyB0aGUgdG9vbHRpcCBvblxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSB0aXAgLSBzdHJpbmcgdG8gc2hvdyBpbiB0aGUgdG9vbHRpcFxyXG5cdCAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIC0gYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdG9vbHRpcFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5zdHlsZT1ibGFja10gLSBjb3JyZWxhdGVzIHRvIHRoZSBkaXNjb3JkIHN0eWxpbmcvY29sb3JzIChibGFjaywgYnJhbmQsIGdyZWVuLCBncmV5LCByZWQsIHllbGxvdylcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc2lkZT10b3BdIC0gY2FuIGJlIGFueSBvZiB0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRcclxuXHQgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnByZXZlbnRGbGlwPWZhbHNlXSAtIHByZXZlbnRzIG1vdmluZyB0aGUgdG9vbHRpcCB0byB0aGUgb3Bwb3NpdGUgc2lkZSBpZiBpdCBpcyB0b28gYmlnIG9yIGdvZXMgb2Zmc2NyZWVuXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRpc2FibGVkPWZhbHNlXSAtIHdoZXRoZXIgdGhlIHRvb2x0aXAgc2hvdWxkIGJlIGRpc2FibGVkIGZyb20gc2hvd2luZyBvbiBob3ZlclxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKG5vZGUsIHRleHQsIG9wdGlvbnMgPSB7fSkge1xyXG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZX0gPSBvcHRpb25zO1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgICAgIHRoaXMubGFiZWwgPSB0ZXh0O1xyXG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0dGhpcy5zaWRlID0gc2lkZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHRoaXMucHJldmVudEZsaXAgPSBwcmV2ZW50RmxpcDtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmICghY2xhc3NFeGlzdHModGhpcy5zaWRlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU2lkZSAke3RoaXMuc2lkZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0XHJcblx0XHR0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XHJcblxyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxyXG5cclxuXHRcdGNvbnN0IHBvaW50ZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQocG9pbnRlckVsZW1lbnQpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLnRvb2x0aXBFbGVtZW50KTtcclxuXHJcblx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0aGlzLnNob3coKTtcclxuXHJcblx0XHRcdGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG5cdFx0XHRcdG11dGF0aW9ucy5mb3JFYWNoKChtdXRhdGlvbikgPT4ge1xyXG5cdFx0XHRcdFx0Y29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcblx0XHRcdFx0XHRjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2YodGhpcy5ub2RlKSA+IC0xO1xyXG5cdFx0XHRcdFx0Y29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnModGhpcy5ub2RlKSk7XHJcblx0XHRcdFx0XHRpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5oaWRlKCk7XHJcblx0XHRcdFx0XHRcdG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHRcdFx0fSk7XHJcblxyXG5cdFx0XHRvYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHksIHtzdWJ0cmVlOiB0cnVlLCBjaGlsZExpc3Q6IHRydWV9KTtcclxuXHRcdH0pO1xyXG5cclxuXHRcdHRoaXMubm9kZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCAoKSA9PiB7XHJcblx0XHRcdHRoaXMuaGlkZSgpO1xyXG5cdFx0fSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbnRhaW5lciB3aGVyZSB0aGUgdG9vbHRpcCB3aWxsIGJlIGFwcGVuZGVkLiAqL1xyXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUucG9wb3V0cylbMF0ucG9wb3V0cy5zcGxpdChcIiBcIilbMF0rXCIgfiAuXCIrQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJDb250YWluZXIpWzBdLmxheWVyQ29udGFpbmVyLnNwbGl0KFwiIFwiKVswXSk7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYWJvdmUgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QWJvdmUoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIGJlbG93IHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0JlbG93KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IFV0aWxzLnNjcmVlbkhlaWdodDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgbGVmdCBvZiB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dMZWZ0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPj0gMDsgfVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiB0byB0aGUgcmlnaHQgb2YgdGhlIGVsZW1lbnQgKi9cclxuXHRnZXQgY2FuU2hvd1JpZ2h0KCkgeyByZXR1cm4gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyB0aGlzLm5vZGUub2Zmc2V0V2lkdGggKyB0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggPD0gVXRpbHMuc2NyZWVuV2lkdGg7IH1cclxuXHJcbiAgICAvKiogSGlkZXMgdGhlIHRvb2x0aXAuIEF1dG9tYXRpY2FsbHkgY2FsbGVkIG9uIG1vdXNlbGVhdmUuICovXHJcblx0aGlkZSgpIHtcclxuICAgICAgICB0aGlzLmVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSB0aGlzLl9jbGFzc05hbWU7XHJcblx0fVxyXG5cclxuICAgIC8qKiBTaG93cyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VlbnRlci4gV2lsbCBhdHRlbXB0IHRvIGZsaXAgaWYgcG9zaXRpb24gd2FzIHdyb25nLiAqL1xyXG5cdHNob3coKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwRWxlbWVudC5jbGFzc05hbWUgPSBgJHtnZXRUb29sdGlwQ2xhc3NlcygpLnRvb2x0aXB9ICR7Z2V0Q2xhc3ModGhpcy5zdHlsZSl9YDtcclxuXHRcdHRoaXMubGFiZWxFbGVtZW50LnRleHRDb250ZW50ID0gdGhpcy5sYWJlbDtcclxuXHRcdHRoaXMuY29udGFpbmVyLmFwcGVuZCh0aGlzLmVsZW1lbnQpO1xyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJ0b3BcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QWJvdmUgfHwgKCF0aGlzLmNhblNob3dBYm92ZSAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QWJvdmUoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJib3R0b21cIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93QmVsb3cgfHwgKCF0aGlzLmNhblNob3dCZWxvdyAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93QmVsb3coKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJsZWZ0XCIpIHtcclxuXHRcdFx0aWYgKHRoaXMuY2FuU2hvd0xlZnQgfHwgKCF0aGlzLmNhblNob3dMZWZ0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHRcdGVsc2UgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiAodGhpcy5zaWRlID09IFwicmlnaHRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93UmlnaHQgfHwgKCF0aGlzLmNhblNob3dSaWdodCAmJiB0aGlzLnByZXZlbnRGbGlwKSkgdGhpcy5zaG93UmlnaHQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dMZWZ0KCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGFib3ZlIHRoZSBub2RlLiAqL1xyXG5cdHNob3dBYm92ZSgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInRvcFwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gdGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCBiZWxvdyB0aGUgbm9kZS4gKi9cclxuXHRzaG93QmVsb3coKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJib3R0b21cIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwidG9wXCIsIHRvUHgodGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgKyAxMCkpO1xyXG5cdFx0dGhpcy5jZW50ZXJIb3Jpem9udGFsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIGxlZnQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd0xlZnQoKSB7XHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJsZWZ0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCAtIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIHJpZ2h0IG9mIHRoZSBub2RlLiAqL1xyXG5cdHNob3dSaWdodCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcInJpZ2h0XCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcImxlZnRcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlclZlcnRpY2FsbHkoKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlckhvcml6b250YWxseSgpIHtcclxuICAgICAgICBjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgKyAodGhpcy5ub2RlLm9mZnNldFdpZHRoIC8gMik7XHJcbiAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC8gMikpKTtcclxuXHR9XHJcblxyXG5cdGNlbnRlclZlcnRpY2FsbHkoKSB7XHJcblx0XHRjb25zdCBub2RlY2VudGVyID0gdGhpcy5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArICh0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IC8gMik7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeChub2RlY2VudGVyIC0gKHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgLyAyKSkpO1xyXG5cdH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBjb25zdCB7c3R5bGUgPSBcImJsYWNrXCIsIHNpZGUgPSBcInRvcFwiLCB0ZXh0ID0gXCJcIn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHRoaXMubm9kZSA9IEJEVjIucmVhY3REb20uZmluZERPTU5vZGUodGhpcyk7XHJcbiAgICAgICAgdGhpcy50b29sdGlwID0gbmV3IFRvb2x0aXAodGhpcy5ub2RlLCB0ZXh0LCB7c3R5bGUsIHNpZGV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXAuaGlkZSgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLnRvb2x0aXA7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19YU3ZnIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge3htbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsIHZpZXdCb3g6IFwiMCAwIDEyIDEyXCIsIHN0eWxlOiB7d2lkdGg6IFwiMThweFwiLCBoZWlnaHQ6IFwiMThweFwifX0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZ1wiLFxyXG4gICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJiYWNrZ3JvdW5kXCIsIGZpbGw6IFwibm9uZVwiLCBmaWxsUnVsZTogXCJldmVub2RkXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMCAwaDEydjEySDBcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7Y2xhc3NOYW1lOiBcImZpbGxcIiwgZmlsbDogXCIjZGNkZGRlXCIsIGQ6IFwiTTkuNSAzLjIwNUw4Ljc5NSAyLjUgNiA1LjI5NSAzLjIwNSAyLjVsLS43MDUuNzA1TDUuMjk1IDYgMi41IDguNzk1bC43MDUuNzA1TDYgNi43MDUgOC43OTUgOS41bC43MDUtLjcwNUw2LjcwNSA2XCJ9KVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJldmVudHNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwibWtkaXJwXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vZHVsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicmVxdWVzdFwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJyaW1yYWZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwieWF1emxcIik7Il0sInNvdXJjZVJvb3QiOiIifQ== |