mirror of
https://github.com/Lightcord/Lightcord.git
synced 2025-04-12 00:55:40 +02:00
12114 lines
1.5 MiB
12114 lines
1.5 MiB
module.exports =
|
|
/******/ (function(modules) { // webpackBootstrap
|
|
/******/ // The module cache
|
|
/******/ var installedModules = {};
|
|
/******/
|
|
/******/ // The require function
|
|
/******/ function __webpack_require__(moduleId) {
|
|
/******/
|
|
/******/ // Check if module is in cache
|
|
/******/ if(installedModules[moduleId]) {
|
|
/******/ return installedModules[moduleId].exports;
|
|
/******/ }
|
|
/******/ // Create a new module (and put it into the cache)
|
|
/******/ var module = installedModules[moduleId] = {
|
|
/******/ i: moduleId,
|
|
/******/ l: false,
|
|
/******/ exports: {}
|
|
/******/ };
|
|
/******/
|
|
/******/ // Execute the module function
|
|
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
|
/******/
|
|
/******/ // Flag the module as loaded
|
|
/******/ module.l = true;
|
|
/******/
|
|
/******/ // Return the exports of the module
|
|
/******/ return module.exports;
|
|
/******/ }
|
|
/******/
|
|
/******/
|
|
/******/ // expose the modules object (__webpack_modules__)
|
|
/******/ __webpack_require__.m = modules;
|
|
/******/
|
|
/******/ // expose the module cache
|
|
/******/ __webpack_require__.c = installedModules;
|
|
/******/
|
|
/******/ // define getter function for harmony exports
|
|
/******/ __webpack_require__.d = function(exports, name, getter) {
|
|
/******/ if(!__webpack_require__.o(exports, name)) {
|
|
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
|
/******/ }
|
|
/******/ };
|
|
/******/
|
|
/******/ // define __esModule on exports
|
|
/******/ __webpack_require__.r = function(exports) {
|
|
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
/******/ }
|
|
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
/******/ };
|
|
/******/
|
|
/******/ // create a fake namespace object
|
|
/******/ // mode & 1: value is a module id, require it
|
|
/******/ // mode & 2: merge all properties of value into the ns
|
|
/******/ // mode & 4: return value when already ns object
|
|
/******/ // mode & 8|1: behave like require
|
|
/******/ __webpack_require__.t = function(value, mode) {
|
|
/******/ if(mode & 1) value = __webpack_require__(value);
|
|
/******/ if(mode & 8) return value;
|
|
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
|
/******/ var ns = Object.create(null);
|
|
/******/ __webpack_require__.r(ns);
|
|
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
|
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
|
/******/ return ns;
|
|
/******/ };
|
|
/******/
|
|
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
|
/******/ __webpack_require__.n = function(module) {
|
|
/******/ var getter = module && module.__esModule ?
|
|
/******/ function getDefault() { return module['default']; } :
|
|
/******/ function getModuleExports() { return module; };
|
|
/******/ __webpack_require__.d(getter, 'a', getter);
|
|
/******/ return getter;
|
|
/******/ };
|
|
/******/
|
|
/******/ // Object.prototype.hasOwnProperty.call
|
|
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
|
/******/
|
|
/******/ // __webpack_public_path__
|
|
/******/ __webpack_require__.p = "";
|
|
/******/
|
|
/******/
|
|
/******/ // Load entry module and return exports
|
|
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.js");
|
|
/******/ })
|
|
/************************************************************************/
|
|
/******/ ({
|
|
|
|
/***/ "./src/0globals.js":
|
|
/*!*************************!*\
|
|
!*** ./src/0globals.js ***!
|
|
\*************************/
|
|
/*! exports provided: minimumDiscordVersion, currentDiscordVersion, minSupportedVersion, bbdVersion, 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__, "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; });
|
|
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.5";
|
|
const bbdChangelog = {
|
|
description: "Big things are coming.",
|
|
changes: [{
|
|
title: "Bug Fixes",
|
|
type: "fixed",
|
|
items: ["Some fixes related to showing modals in the `BdApi`.", "Fixed the open folder buttons for plugins and themes"]
|
|
}]
|
|
};
|
|
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"
|
|
},
|
|
"Enable Edit Button": {
|
|
id: "fork-ps-7",
|
|
info: "Enable an Edit Button on the plugin and theme panel.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "core",
|
|
category: "content manager"
|
|
},
|
|
"Themes in Popout Window": {
|
|
id: "lightcord-9",
|
|
info: "Enable themes in Popout Window. (For example, when detaching screenshare.)",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "core",
|
|
category: "content manager",
|
|
experimental: true
|
|
},
|
|
|
|
/* 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"
|
|
},
|
|
|
|
/** Lightcord */
|
|
"Disable BetterDiscord": {
|
|
id: "bd-disable",
|
|
info: "Disable Betterdiscord (plugins, themes, etc) (Not implemented).",
|
|
implemented: false,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Blur Personal Information": {
|
|
id: "lightcord-6",
|
|
info: "Blur sensitive informations like email, payment infos and more.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Calling Ring Beat": {
|
|
id: "lightcord-2",
|
|
info: "Enable Discord's special calling beat.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Developer Options": {
|
|
id: "lightcord-1",
|
|
info: "Enable Discord's & Lightcord's Internal Developer Options. This allow the \"Experiments\" tab, the \"Developer Options\" tab and the \"Lightcord Api\" section.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Ad Block": {
|
|
id: "lightcord-4",
|
|
info: "Block any BOT that dms you with an invite link. Even in an embed.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Enable Lightcord Servers": {
|
|
id: "lightcord-5",
|
|
info: "Enable Lightcord's servers. Disabling this will disable custom badges.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Disable typing": {
|
|
id: "lightcord-7",
|
|
info: "Don't let other see you're typing.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord"
|
|
},
|
|
"Lightcord Tabs": {
|
|
id: "lightcord-8",
|
|
info: "Allows you to launch multiple instances of Lightcord in the same window.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Lightcord",
|
|
experimental: true
|
|
},
|
|
"Use Notification Shim": {
|
|
id: "lightcord-10",
|
|
info: "Basically don't use Windows's Notifications.",
|
|
implemented: true,
|
|
hidden: process.platform !== "win32",
|
|
cat: "lightcord",
|
|
category: "Lightcord",
|
|
experimental: false
|
|
},
|
|
|
|
/** Lightcord Window */
|
|
"Always-on-Top": {
|
|
id: "lightcord-3",
|
|
info: "Enable the window's Always-on-Top mode, where Lightcord stays on top of other applications.",
|
|
implemented: true,
|
|
hidden: false,
|
|
cat: "lightcord",
|
|
category: "Window"
|
|
},
|
|
"No Window Bounds": {
|
|
id: "no_window_bound",
|
|
info: "Disable Window Bounds. Can be useful if you use a window manager.",
|
|
implemented: true,
|
|
hidden: process.platform !== "linux",
|
|
cat: "lightcord",
|
|
category: "Window"
|
|
},
|
|
"Enable Glasstron": {
|
|
id: "enable_glasstron",
|
|
info: "Enable Glasstron. If you're not using transparent themes, this can reduce lag.",
|
|
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": false,
|
|
"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-ps-7": false,
|
|
"fork-es-2": false,
|
|
"fork-es-3": true,
|
|
"fork-wp-1": false,
|
|
"fork-wp-2": false,
|
|
"fork-beta": true,
|
|
"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,
|
|
"lightcord-8": false,
|
|
"lightcord-9": false,
|
|
"lightcord-10": false,
|
|
"no_window_bound": 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) => {
|
|
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"]); // TODO: Change Init mode and stop using CoreWrapper.
|
|
|
|
class CoreWrapper {
|
|
constructor(bdConfig, methods) {
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setConfig(bdConfig);
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].setMethods(methods);
|
|
}
|
|
|
|
init() {
|
|
// deprecateGlobal("mainCore", this.mainCore);
|
|
_modules_core__WEBPACK_IMPORTED_MODULE_13__["default"].init();
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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 null;
|
|
},
|
|
|
|
// deprecated, deleted all emotes from betterdiscord.
|
|
get screenWidth() {
|
|
return Math.max(document.documentElement.clientWidth, window.innerWidth || 0);
|
|
},
|
|
|
|
get screenHeight() {
|
|
return Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
|
|
}
|
|
|
|
};
|
|
|
|
BdApi.getAllWindowPreferences = function () {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getAllWindowPreferences();
|
|
};
|
|
|
|
BdApi.getWindowPreference = function (key) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].getWindowPreference(key);
|
|
};
|
|
|
|
BdApi.setWindowPreference = function (key, value) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].setWindowPreference(key, value);
|
|
}; //Inject CSS to document head
|
|
//id = id of element
|
|
//css = custom css
|
|
|
|
|
|
BdApi.injectCSS = function (id, css) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), css);
|
|
}; //Clear css/remove any element
|
|
//id = id of element
|
|
|
|
|
|
BdApi.clearCSS = function (id) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeStyle(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
|
|
}; //Inject CSS to document head
|
|
//id = id of element
|
|
//css = custom css
|
|
|
|
|
|
BdApi.linkJS = function (id, url) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id), url);
|
|
}; //Clear css/remove any element
|
|
//id = id of element
|
|
|
|
|
|
BdApi.unlinkJS = function (id) {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeScript(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].escapeID(id));
|
|
}; //Get another plugin
|
|
//name = name of plugin
|
|
|
|
|
|
BdApi.getPlugin = function (name) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"].hasOwnProperty(name)) {
|
|
return _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][name].plugin;
|
|
}
|
|
|
|
return null;
|
|
}; //Get BetterDiscord Core
|
|
|
|
|
|
BdApi.getCore = function () {
|
|
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].warn("Deprecation Notice", `BdApi.getCore() will be removed in future versions.`);
|
|
return _core__WEBPACK_IMPORTED_MODULE_1__["default"];
|
|
};
|
|
/**
|
|
* Shows a generic but very customizable modal.
|
|
* @param {string} title - title of the modal
|
|
* @param {string} content - a string of text to display in the modal
|
|
*/
|
|
|
|
|
|
BdApi.alert = function (title, content) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, {
|
|
cancelText: null
|
|
});
|
|
};
|
|
/**
|
|
* Shows a generic but very customizable confirmation modal with optional confirm and cancel callbacks.
|
|
* @param {string} title - title of the modal
|
|
* @param {(string|ReactElement|Array<string|ReactElement>)} children - a single or mixed array of react elements and strings. Every string is wrapped in Discord's `Markdown` component so strings will show and render properly.
|
|
* @param {object} [options] - options to modify the modal
|
|
* @param {boolean} [options.danger=false] - whether the main button should be red or not
|
|
* @param {string} [options.confirmText=Okay] - text for the confirmation/submit button
|
|
* @param {string} [options.cancelText=Cancel] - text for the cancel button
|
|
* @param {callable} [options.onConfirm=NOOP] - callback to occur when clicking the submit button
|
|
* @param {callable} [options.onCancel=NOOP] - callback to occur when clicking the cancel button
|
|
* @param {string} [options.key] - key used to identify the modal. If not provided, one is generated and returned
|
|
* @returns {string} - the key used for this modal
|
|
*/
|
|
|
|
|
|
BdApi.showConfirmationModal = function (title, content, options = {}) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].showConfirmationModal(title, content, options);
|
|
}; //Show toast alert
|
|
|
|
|
|
BdApi.showToast = function (content, options = {}) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_2__["default"].showToast(content, options);
|
|
}; // Finds module
|
|
|
|
|
|
BdApi.findModule = function (filter) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.find(filter);
|
|
}; // Finds module
|
|
|
|
|
|
BdApi.findAllModules = function (filter) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findAll(filter);
|
|
}; // Finds module
|
|
|
|
|
|
BdApi.findModuleByProps = function (...props) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByUniqueProperties(props);
|
|
};
|
|
|
|
BdApi.findModuleByPrototypes = function (...protos) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByPrototypes(protos);
|
|
};
|
|
|
|
BdApi.findModuleByDisplayName = function (name) {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].WebpackModules.findByDisplayName(name);
|
|
}; // Gets react instance
|
|
|
|
|
|
BdApi.getInternalInstance = function (node) {
|
|
if (!(node instanceof window.jQuery) && !(node instanceof Element)) return undefined;
|
|
if (node instanceof jQuery) node = node[0];
|
|
return _v2__WEBPACK_IMPORTED_MODULE_3__["default"].getInternalInstance(node);
|
|
}; // Gets data
|
|
|
|
|
|
BdApi.loadData = function (pluginName, key) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getPluginData(pluginName, key);
|
|
};
|
|
|
|
BdApi.getData = BdApi.loadData; // Sets data
|
|
|
|
BdApi.saveData = function (pluginName, key, data) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setPluginData(pluginName, key, data);
|
|
};
|
|
|
|
BdApi.setData = BdApi.saveData; // Deletes data
|
|
|
|
BdApi.deleteData = function (pluginName, key) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].deletePluginData(pluginName, key);
|
|
}; // Patches other functions
|
|
|
|
|
|
BdApi.monkeyPatch = function (what, methodName, options) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(what, methodName, options);
|
|
}; // Event when element is removed
|
|
|
|
|
|
BdApi.onRemoved = function (node, callback) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].onRemoved(node, callback);
|
|
}; // Wraps function in try..catch
|
|
|
|
|
|
BdApi.suppressErrors = function (method, message) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].suppressErrors(method, message);
|
|
}; // Tests for valid JSON
|
|
|
|
|
|
BdApi.testJSON = function (data) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_2__["default"].testJSON(data);
|
|
};
|
|
|
|
BdApi.isPluginEnabled = function (name) {
|
|
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name];
|
|
};
|
|
|
|
BdApi.isThemeEnabled = function (name) {
|
|
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name];
|
|
};
|
|
|
|
BdApi.isSettingEnabled = function (id) {
|
|
return !!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id];
|
|
};
|
|
|
|
BdApi.enableSetting = function (id) {
|
|
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, true);
|
|
};
|
|
|
|
BdApi.disableSetting = function (id) {
|
|
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, false);
|
|
};
|
|
|
|
BdApi.toggleSetting = function (id) {
|
|
return _settingsPanel__WEBPACK_IMPORTED_MODULE_7__["default"].onChange(id, !_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id]);
|
|
}; // Gets data
|
|
|
|
|
|
BdApi.getBDData = function (key) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getBDData(key);
|
|
}; // Sets data
|
|
|
|
|
|
BdApi.setBDData = function (key, data) {
|
|
return _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setBDData(key, data);
|
|
};
|
|
|
|
const makeAddonAPI = (cookie, list, manager) => new class AddonAPI {
|
|
get folder() {
|
|
return manager.folder;
|
|
}
|
|
|
|
isEnabled(name) {
|
|
return !!cookie[name];
|
|
}
|
|
|
|
enable(name) {
|
|
return manager.enable(name);
|
|
}
|
|
|
|
disable(name) {
|
|
return manager.disable(name);
|
|
}
|
|
|
|
toggle(name) {
|
|
if (cookie[name]) this.disable(name);else this.enable(name);
|
|
}
|
|
|
|
reload(name) {
|
|
return manager.reload(name);
|
|
}
|
|
|
|
get(name) {
|
|
if (list.hasOwnProperty(name)) {
|
|
if (list[name].plugin) return list[name].plugin;
|
|
return list[name];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
getAll() {
|
|
return Object.keys(list).map(k => this.get(k)).filter(a => a);
|
|
}
|
|
|
|
}();
|
|
|
|
BdApi.Plugins = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"], _pluginModule__WEBPACK_IMPORTED_MODULE_5__["default"]);
|
|
BdApi.Themes = makeAddonAPI(_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"], _themeModule__WEBPACK_IMPORTED_MODULE_6__["default"]);
|
|
/* harmony default export */ __webpack_exports__["default"] = (BdApi);
|
|
window.Lightcord.BetterDiscord.BdApi = BdApi;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/bdEvents.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/modules/bdEvents.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* BDEvents */
|
|
const EventEmitter = __webpack_require__(/*! events */ "events");
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class BDEvents extends EventEmitter {
|
|
constructor() {
|
|
super();
|
|
window.Lightcord.BetterDiscord.BDEvents = this;
|
|
}
|
|
|
|
dispatch(eventName, ...args) {
|
|
this.emit(eventName, ...args);
|
|
}
|
|
|
|
off(eventName, eventAction) {
|
|
this.removeListener(eventName, eventAction);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/blurPrivate.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/blurPrivate.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/**
|
|
* Credits to @hellbound1337 on github for the css
|
|
*/
|
|
|
|
|
|
let selectors;
|
|
const removeDa = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].removeDa;
|
|
|
|
function getSelectors() {
|
|
let standardSidebarView = BDModules.get(e => e.standardSidebarView)[0];
|
|
if (!standardSidebarView) return null;
|
|
let defaultClassName = removeDa(standardSidebarView.standardSidebarView);
|
|
let selects = [];
|
|
let userSettingsAccount = BDModules.get(e => e.userSettingsAccount)[0];
|
|
const children = BDModules.get(e => typeof e.children === "string")[0];
|
|
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)}`);
|
|
|
|
if (userSettingsAccount) {
|
|
selects.push(`#app-mount .${defaultClassName} .${removeDa(userSettingsAccount.userSettingsAccount)} div:nth-child(2)>div:nth-child(2)>.${removeDa(BDModules.get(e => e.viewBody)[0].viewBody)}`);
|
|
selects.push(`.${removeDa(userSettingsAccount.userSettingsSecurity)} .${removeDa(children.children)} > div:nth-child(2)`);
|
|
}
|
|
|
|
console.log(selects);
|
|
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.join(", ")} {
|
|
transition: all 150ms cubic-bezier(.55,.085,.68,.53);
|
|
filter: blur(4px);
|
|
opacity: .8;
|
|
}
|
|
|
|
${selectors.map(e => e + ":hover").join(", ")} {
|
|
transition: all 150ms cubic-bezier(.55,.09,.68,.53);
|
|
filter: none;
|
|
opacity: 1;
|
|
}`);
|
|
}
|
|
|
|
disable() {
|
|
if (!this.enabled) return;
|
|
this.enabled = false;
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("blurPrivate");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/classNormalizer.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/modules/classNormalizer.js ***!
|
|
\****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
|
|
const normalizedPrefix = "da";
|
|
const randClass = new RegExp(`^(?!${normalizedPrefix}-)((?:[A-Za-z]|[0-9]|-)+)-(?:[A-Za-z]|[0-9]|-|_){6}$`);
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class ClassNormalizer {
|
|
constructor() {
|
|
window.Lightcord.BetterDiscord.ClassNormalizer = this;
|
|
}
|
|
|
|
stop() {
|
|
if (!this.hasPatched) return;
|
|
this.unpatchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
|
|
this.revertElement(document.querySelector("#app-mount"));
|
|
this.hasPatched = false;
|
|
}
|
|
|
|
start() {
|
|
if (this.hasPatched) return;
|
|
this.patchClassModules(_webpackModules__WEBPACK_IMPORTED_MODULE_0__["default"].findAll(this.moduleFilter.bind(this)));
|
|
this.normalizeElement(document.querySelector("#app-mount"));
|
|
this.hasPatched = true;
|
|
this.patchDOMMethods();
|
|
}
|
|
|
|
patchClassModules(modules) {
|
|
for (const module of modules) {
|
|
this.patchClassModule(normalizedPrefix, module);
|
|
}
|
|
}
|
|
|
|
unpatchClassModules(modules) {
|
|
for (const module of modules) {
|
|
this.unpatchClassModule(normalizedPrefix, module);
|
|
}
|
|
}
|
|
|
|
shouldIgnore(value) {
|
|
if (!isNaN(value)) return true;
|
|
if (value.endsWith("px") || value.endsWith("ch") || value.endsWith("em") || value.endsWith("ms")) return true;
|
|
if (value.startsWith("layerContainer-")) return true;
|
|
if (value.startsWith("#") && (value.length == 7 || value.length == 4)) return true;
|
|
if (value.includes("calc(") || value.includes("rgba")) return true;
|
|
return false;
|
|
}
|
|
|
|
moduleFilter(module) {
|
|
if (typeof module !== "object" || Array.isArray(module)) return false;
|
|
if (module.__esModule) return false;
|
|
if (!Object.keys(module).length) return false;
|
|
|
|
for (const baseClassName in module) {
|
|
const value = module[baseClassName];
|
|
if (typeof value !== "string") return false;
|
|
if (this.shouldIgnore(value)) continue;
|
|
if (value.split("-").length === 1) return false;
|
|
if (!randClass.test(value.split(" ")[0])) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
patchClassModule(componentName, classNames) {
|
|
for (const baseClassName in classNames) {
|
|
const value = classNames[baseClassName];
|
|
if (this.shouldIgnore(value)) continue;
|
|
const classList = value.split(" ");
|
|
|
|
for (const normalClass of classList) {
|
|
const match = normalClass.match(randClass);
|
|
if (!match || !match.length || match.length < 2) continue; // Shouldn't ever happen since they passed the moduleFilter, but you never know
|
|
|
|
const camelCase = match[1].split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
|
|
classNames[baseClassName] += ` ${componentName}-${camelCase}`;
|
|
}
|
|
}
|
|
}
|
|
|
|
unpatchClassModule(componentName, classNames) {
|
|
for (const baseClassName in classNames) {
|
|
const value = classNames[baseClassName];
|
|
if (this.shouldIgnore(value)) continue;
|
|
let newString = "";
|
|
const classList = value.split(" ");
|
|
|
|
for (const normalClass of classList) {
|
|
if (normalClass.startsWith(`${componentName}-`)) continue;
|
|
newString += ` ${normalClass}`;
|
|
}
|
|
|
|
classNames[baseClassName] = newString.trim();
|
|
}
|
|
}
|
|
|
|
normalizeElement(element) {
|
|
if (!(element instanceof Element)) return;
|
|
const classes = element.classList;
|
|
|
|
for (let c = 0, clen = classes.length; c < clen; c++) {
|
|
if (!randClass.test(classes[c])) continue;
|
|
const match = classes[c].match(randClass)[1];
|
|
const newClass = match.split("-").map((s, i) => i ? s[0].toUpperCase() + s.slice(1) : s).join("");
|
|
element.classList.add(`${normalizedPrefix}-${newClass}`);
|
|
}
|
|
|
|
for (const child of element.children) this.normalizeElement(child);
|
|
}
|
|
|
|
revertElement(element) {
|
|
if (!(element instanceof Element)) return;
|
|
if (element.children && element.children.length) this.revertElement(element.children[0]);
|
|
if (element.nextElementSibling) this.revertElement(element.nextElementSibling);
|
|
const classes = element.classList;
|
|
const toRemove = [];
|
|
|
|
for (let c = 0; c < classes.length; c++) {
|
|
if (classes[c].startsWith(`${normalizedPrefix}-`)) toRemove.push(classes[c]);
|
|
}
|
|
|
|
element.classList.remove(...toRemove);
|
|
}
|
|
|
|
patchDOMMethods() {
|
|
const contains = DOMTokenList.prototype.contains;
|
|
|
|
DOMTokenList.prototype.contains = function (token) {
|
|
// const tokens = token.split(" ");
|
|
return Reflect.apply(contains, this, [token.split(" ")[0]]); // return tokens.every(t => contains.call(this, t));
|
|
};
|
|
|
|
const add = DOMTokenList.prototype.add;
|
|
|
|
DOMTokenList.prototype.add = function (...tokens) {
|
|
for (let t = 0; t < tokens.length; t++) {
|
|
tokens[t] = tokens[t].split(" ")[0];
|
|
}
|
|
|
|
return Reflect.apply(add, this, tokens);
|
|
};
|
|
|
|
const remove = DOMTokenList.prototype.remove;
|
|
|
|
DOMTokenList.prototype.remove = function (...tokens) {
|
|
for (let t = 0; t < tokens.length; t++) {
|
|
tokens[t] = tokens[t].split(" ")[0];
|
|
}
|
|
|
|
return Reflect.apply(remove, this, tokens);
|
|
};
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/coloredText.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/coloredText.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class ColoredText {
|
|
injectColoredText() {
|
|
if (this.cancelColoredText) return;
|
|
if (!_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent) return;
|
|
this.cancelColoredText = _utils__WEBPACK_IMPORTED_MODULE_2__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_1__["default"].MessageComponent, "default", {
|
|
before: data => {
|
|
const props = data.methodArguments[0];
|
|
if (!props || !props.childrenMessageContent) return;
|
|
const messageContent = props.childrenMessageContent;
|
|
if (!messageContent.type || !messageContent.type.type || messageContent.type.type.displayName != "MessageContent") return;
|
|
const originalType = messageContent.type.type;
|
|
if (originalType.__originalMethod) return; // Don't patch again
|
|
|
|
messageContent.type.type = function (props) {
|
|
const returnValue = originalType(props);
|
|
const roleColor = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"] ? props.message.colorString || "" : "";
|
|
returnValue.props.style = {
|
|
color: roleColor
|
|
};
|
|
return returnValue;
|
|
};
|
|
|
|
messageContent.type.type.__originalMethod = originalType;
|
|
Object.assign(messageContent.type.type, originalType);
|
|
}
|
|
});
|
|
}
|
|
|
|
removeColoredText() {
|
|
let classNameMarkup = BDModules.get(e => e.markup)[0].markup;
|
|
document.querySelectorAll("." + classNameMarkup.split(" ")[0]).forEach(elem => {
|
|
elem.style.setProperty("color", "");
|
|
});
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/contentManager.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/modules/contentManager.js ***!
|
|
\***************************************/
|
|
/*! exports provided: addonCache, default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addonCache", function() { return addonCache; });
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const path = __webpack_require__(/*! path */ "path");
|
|
|
|
const fs = __webpack_require__(/*! fs */ "fs");
|
|
|
|
const Module = __webpack_require__(/*! module */ "module").Module;
|
|
|
|
Module.globalPaths.push(path.resolve(__webpack_require__(/*! electron */ "electron").remote.app.getAppPath(), "node_modules"));
|
|
|
|
class MetaError extends Error {
|
|
constructor(message) {
|
|
super(message);
|
|
this.name = "MetaError";
|
|
}
|
|
|
|
}
|
|
|
|
const originalJSRequire = Module._extensions[".js"];
|
|
const originalCSSRequire = Module._extensions[".css"] ? Module._extensions[".css"] : () => {
|
|
return null;
|
|
};
|
|
const splitRegex = /[^\S\r\n]*?(?:\r\n|\n)[^\S\r\n]*?\*[^\S\r\n]?/;
|
|
const escapedAtRegex = /^\\@/;
|
|
let addonCache = {};
|
|
let hasPatched = false;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class ContentManager {
|
|
constructor() {
|
|
this.timeCache = {};
|
|
this.watchers = {};
|
|
}
|
|
|
|
patchExtensions() {
|
|
if (hasPatched) return;
|
|
hasPatched = true;
|
|
Module._extensions[".js"] = this.getContentRequire("plugin");
|
|
Module._extensions[".css"] = this.getContentRequire("theme");
|
|
}
|
|
|
|
get pluginsFolder() {
|
|
return this._pluginsFolder || (this._pluginsFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "plugins/")));
|
|
}
|
|
|
|
get themesFolder() {
|
|
return this._themesFolder || (this._themesFolder = fs.realpathSync(path.resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].dataPath + "themes/")));
|
|
}
|
|
|
|
loadAddonCertifierCache() {
|
|
if (typeof _dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getSettingGroup("PluginCertifierHashes") !== "string") {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])("{}"));
|
|
} else {
|
|
try {
|
|
addonCache = JSON.parse(Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["decryptSettingsCache"])(_dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].getSettingGroup("PluginCertifierHashes")));
|
|
} catch (e) {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])("{}"));
|
|
addonCache = {};
|
|
}
|
|
}
|
|
|
|
Object.keys(addonCache).forEach(key => {
|
|
let value = addonCache[key];
|
|
if (!value || typeof value !== "object" || Array.isArray(value)) return delete addonCache[key];
|
|
let props = [{
|
|
key: "timestamp",
|
|
type: "number"
|
|
}, {
|
|
key: "result",
|
|
type: "object"
|
|
}, {
|
|
key: "hash",
|
|
type: "string"
|
|
}];
|
|
|
|
for (let prop of props) {
|
|
if (!(prop.key in value) || typeof value[prop.key] !== prop.type) {
|
|
delete addonCache[key];
|
|
return;
|
|
}
|
|
}
|
|
|
|
if (value.hash !== key) {
|
|
delete addonCache[key];
|
|
return;
|
|
}
|
|
|
|
if (value.result.suspect) {
|
|
// refetch from remote to be sure you're up to date.
|
|
delete addonCache[key];
|
|
return;
|
|
}
|
|
});
|
|
this.saveAddonCache();
|
|
}
|
|
|
|
saveAddonCache() {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_4__["default"].setSettingGroup("PluginCertifierHashes", Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["encryptSettingsCache"])(JSON.stringify(addonCache)));
|
|
}
|
|
|
|
watchContent(contentType) {
|
|
if (this.watchers[contentType]) return;
|
|
const isPlugin = contentType === "plugin";
|
|
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
|
|
this.watchers[contentType] = fs.watch(baseFolder, {
|
|
persistent: false
|
|
}, async (eventType, filename) => {
|
|
if (!eventType || !filename || !filename.endsWith(fileEnding)) return;
|
|
await new Promise(r => setTimeout(r, 50));
|
|
|
|
try {
|
|
fs.statSync(path.resolve(baseFolder, filename));
|
|
} catch (err) {
|
|
if (err.code !== "ENOENT") return;
|
|
delete this.timeCache[filename];
|
|
if (isPlugin) return _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].unloadPlugin(filename);
|
|
return _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].unloadTheme(filename);
|
|
}
|
|
|
|
if (!fs.statSync(path.resolve(baseFolder, filename)).isFile()) return;
|
|
const stats = fs.statSync(path.resolve(baseFolder, filename));
|
|
if (!stats || !stats.mtime || !stats.mtime.getTime()) return;
|
|
if (typeof stats.mtime.getTime() !== "number") return;
|
|
if (this.timeCache[filename] == stats.mtime.getTime()) return;
|
|
this.timeCache[filename] = stats.mtime.getTime();
|
|
|
|
if (eventType == "rename") {
|
|
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].loadTheme(filename);
|
|
}
|
|
|
|
if (eventType == "change") {
|
|
if (isPlugin) await _pluginModule__WEBPACK_IMPORTED_MODULE_1__["default"].reloadPlugin(filename);else await _themeModule__WEBPACK_IMPORTED_MODULE_2__["default"].reloadTheme(filename);
|
|
}
|
|
});
|
|
}
|
|
|
|
unwatchContent(contentType) {
|
|
if (!this.watchers[contentType]) return;
|
|
this.watchers[contentType].close();
|
|
delete this.watchers[contentType];
|
|
}
|
|
|
|
extractMeta(content) {
|
|
const firstLine = content.split("\n")[0];
|
|
const hasOldMeta = firstLine.includes("//META");
|
|
if (hasOldMeta) return this.parseOldMeta(content);
|
|
const hasNewMeta = firstLine.includes("/**");
|
|
if (hasNewMeta) return this.parseNewMeta(content);
|
|
throw new MetaError("META was not found.");
|
|
}
|
|
|
|
parseOldMeta(content) {
|
|
const meta = content.split("\n")[0];
|
|
const rawMeta = meta.substring(meta.lastIndexOf("//META") + 6, meta.lastIndexOf("*//"));
|
|
if (meta.indexOf("META") < 0) throw new MetaError("META was not found.");
|
|
const parsed = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].testJSON(rawMeta);
|
|
if (!parsed) throw new MetaError("META could not be parsed.");
|
|
if (!parsed.name) throw new MetaError("META missing name data.");
|
|
parsed.format = "json";
|
|
return parsed;
|
|
}
|
|
|
|
parseNewMeta(content) {
|
|
const block = content.split("/**", 2)[1].split("*/", 1)[0];
|
|
const out = {};
|
|
let field = "";
|
|
let accum = "";
|
|
|
|
for (const line of block.split(splitRegex)) {
|
|
if (line.length === 0) continue;
|
|
|
|
if (line.charAt(0) === "@" && line.charAt(1) !== " ") {
|
|
out[field] = accum;
|
|
const l = line.indexOf(" ");
|
|
field = line.substr(1, l - 1);
|
|
accum = line.substr(l + 1);
|
|
} else {
|
|
accum += " " + line.replace("\\n", "\n").replace(escapedAtRegex, "@");
|
|
}
|
|
}
|
|
|
|
out[field] = accum.trim();
|
|
delete out[""];
|
|
out.format = "jsdoc";
|
|
return out;
|
|
}
|
|
|
|
getContentRequire(type) {
|
|
const isPlugin = type === "plugin";
|
|
const self = this;
|
|
const originalRequire = isPlugin ? originalJSRequire : originalCSSRequire;
|
|
return function (module, filename) {
|
|
const baseFolder = isPlugin ? self.pluginsFolder : self.themesFolder;
|
|
const possiblePath = path.resolve(baseFolder, path.basename(filename));
|
|
if (!fs.existsSync(possiblePath) || filename !== fs.realpathSync(possiblePath)) return Reflect.apply(originalRequire, this, arguments);
|
|
let content = fs.readFileSync(filename, "utf8");
|
|
content = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].stripBOM(content);
|
|
const stats = fs.statSync(filename);
|
|
const meta = self.extractMeta(content);
|
|
meta.filename = path.basename(filename);
|
|
meta.added = stats.atimeMs;
|
|
meta.modified = stats.mtimeMs;
|
|
meta.size = stats.size;
|
|
|
|
if (!isPlugin) {
|
|
meta.css = content;
|
|
if (meta.format == "json") meta.css = meta.css.split("\n").slice(1).join("\n");
|
|
content = `module.exports = ${JSON.stringify(meta)};`;
|
|
}
|
|
|
|
if (isPlugin) {
|
|
module._compile(content, module.filename);
|
|
|
|
const didExport = !_utils__WEBPACK_IMPORTED_MODULE_3__["default"].isEmpty(module.exports);
|
|
|
|
if (didExport) {
|
|
meta.type = module.exports;
|
|
module.exports = meta;
|
|
content = "";
|
|
} else {
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("Module Not Exported", `${meta.name}, please start setting module.exports`);
|
|
content += `\nmodule.exports = ${JSON.stringify(meta)};\nmodule.exports.type = ${meta.exports || meta.name};`;
|
|
}
|
|
}
|
|
|
|
module._compile(content, filename);
|
|
};
|
|
}
|
|
|
|
makePlaceholderPlugin(data) {
|
|
return {
|
|
plugin: {
|
|
start: () => {},
|
|
getName: () => {
|
|
return data.name || data.filename;
|
|
},
|
|
getAuthor: () => {
|
|
return "???";
|
|
},
|
|
getDescription: () => {
|
|
return data.message ? data.message : "This plugin was unable to be loaded. Check the author's page for updates.";
|
|
},
|
|
getVersion: () => {
|
|
return "???";
|
|
}
|
|
},
|
|
name: data.name || data.filename,
|
|
filename: data.filename,
|
|
source: data.source ? data.source : "",
|
|
website: data.website ? data.website : ""
|
|
};
|
|
}
|
|
|
|
async loadContent(filename, type) {
|
|
if (typeof filename === "undefined" || typeof type === "undefined") return;
|
|
const isPlugin = type === "plugin";
|
|
const baseFolder = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) {
|
|
let result = await new Promise(resolve => {
|
|
Object(_pluginCertifier__WEBPACK_IMPORTED_MODULE_5__["processFile"])(path.resolve(baseFolder, filename), result => {
|
|
console.log(result);
|
|
resolve(result);
|
|
}, hash => {
|
|
resolve({
|
|
suspect: false,
|
|
hash: hash,
|
|
filename: filename,
|
|
name: filename
|
|
});
|
|
}, true);
|
|
});
|
|
|
|
if (result) {
|
|
addonCache[result.hash] = {
|
|
timestamp: Date.now(),
|
|
hash: result.hash,
|
|
result: result
|
|
};
|
|
this.saveAddonCache();
|
|
|
|
if (result.suspect) {
|
|
return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "This plugin might be dangerous (" + result.harm + ").",
|
|
error: new Error("This plugin might be dangerous (" + result.harm + ").")
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
try {
|
|
window.require(path.resolve(baseFolder, filename));
|
|
} catch (error) {
|
|
return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "Could not be compiled.",
|
|
error: {
|
|
message: error.message,
|
|
stack: error.stack
|
|
}
|
|
};
|
|
}
|
|
|
|
const content = window.require(path.resolve(baseFolder, filename));
|
|
|
|
if (!content.name) return {
|
|
name: filename,
|
|
file: filename,
|
|
message: "Cannot escape the ID.",
|
|
error: new Error("Cannot read property 'replace' of undefined")
|
|
};
|
|
content.id = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].escapeID(content.name); //if(!id)return {name: filename, file: filename, message: "Invalid ID", error: new Error("Please fix the name of "+filename+". BetterDiscord can't escape an ID.")}
|
|
|
|
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) {
|
|
this.patchExtensions();
|
|
const isPlugin = type === "plugin";
|
|
const fileEnding = isPlugin ? ".plugin.js" : ".theme.css";
|
|
const basedir = isPlugin ? this.pluginsFolder : this.themesFolder;
|
|
const errors = [];
|
|
const files = fs.readdirSync(basedir);
|
|
|
|
for (const filename of files) {
|
|
if (!fs.statSync(path.resolve(basedir, filename)).isFile() || !filename.endsWith(fileEnding)) continue;
|
|
const error = await this.loadContent(filename, type);
|
|
if (error) errors.push(error);
|
|
}
|
|
|
|
return errors;
|
|
}
|
|
|
|
loadPlugins() {
|
|
return this.loadAllContent("plugin");
|
|
}
|
|
|
|
loadThemes() {
|
|
return this.loadAllContent("theme");
|
|
}
|
|
|
|
}());
|
|
/**
|
|
* Don't expose contentManager - could be dangerous for now
|
|
*/
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/core.js":
|
|
/*!*****************************!*\
|
|
!*** ./src/modules/core.js ***!
|
|
\*****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsPanel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./settingsPanel */ "./src/modules/settingsPanel.js");
|
|
/* harmony import */ var _pluginModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _themeModule__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../ui/bdLogo */ "./src/ui/bdLogo.js");
|
|
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
/* harmony import */ var _svg_lightcord__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../svg/lightcord */ "./src/svg/lightcord.jsx");
|
|
/* harmony import */ var _pluginCertifier__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./pluginCertifier */ "./src/modules/pluginCertifier.js");
|
|
/* harmony import */ var _distant__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./distant */ "./src/modules/distant.js");
|
|
/* harmony import */ var _emojiModule__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./emojiModule */ "./src/modules/emojiModule.js");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_15___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_15__);
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let methods;
|
|
|
|
function Core() {}
|
|
|
|
Core.prototype.setConfig = function (config) {
|
|
if (this.hasStarted) return;
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"], config);
|
|
};
|
|
|
|
Object.defineProperty(Core.prototype, "methods", {
|
|
get() {
|
|
return methods;
|
|
}
|
|
|
|
});
|
|
|
|
Core.prototype.setMethods = function (m) {
|
|
if (this.hasStarted) return;
|
|
methods = m;
|
|
};
|
|
|
|
Core.prototype.init = async function () {
|
|
if (this.hasStarted) return;
|
|
this.hasStarted = true;
|
|
|
|
if (!Array.prototype.flat) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + " does not support this old version (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["currentDiscordVersion"] + ") of Discord. Please update your Discord installation before proceeding.");
|
|
return;
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version < _0globals__WEBPACK_IMPORTED_MODULE_0__["minSupportedVersion"]) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BetterDiscord v" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].version + " (your version)" + " is not supported by the latest js (" + _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] + ").<br><br> Please download the latest version from <a href='https://github.com/rauenzi/BetterDiscordApp/releases/latest' target='_blank'>GitHub</a>");
|
|
return;
|
|
}
|
|
|
|
if (window.ED) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with EnhancedDiscord. Please uninstall one of them.");
|
|
return;
|
|
}
|
|
|
|
if (window.WebSocket && window.WebSocket.name && window.WebSocket.name.includes("Patched")) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("Not Supported", "BandagedBD does not work with Powercord. Please uninstall one of them.");
|
|
return;
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttributes.bind(this), "LC Plugin Certifier Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Settings");
|
|
this.initSettings();
|
|
await this.checkForGuilds();
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].initialize();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Updating Settings");
|
|
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].initializeSettings();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Addons Cache");
|
|
await _contentManager__WEBPACK_IMPORTED_MODULE_16__["default"].loadAddonCertifierCache();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Plugins");
|
|
await _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].loadPlugins();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Loading Themes");
|
|
await _themeModule__WEBPACK_IMPORTED_MODULE_5__["default"].loadThemes();
|
|
_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addStyle("customcss", Buffer.from(_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("bdcustomcss"), "base64").toString("utf8"));
|
|
window.addEventListener("beforeunload", function () {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-dc-0"]) document.querySelector(".btn.btn-disconnect").click();
|
|
});
|
|
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].start();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Removing Loading Icon");
|
|
if (document.getElementsByClassName("bd-loaderv2").length) document.getElementsByClassName("bd-loaderv2")[0].remove();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Initializing Main Observer");
|
|
this.initObserver(); // Show loading errors
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].log("Startup", "Collecting Startup Errors");
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].showContentErrors({
|
|
plugins: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"],
|
|
themes: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"]
|
|
});
|
|
}
|
|
|
|
const previousVersion = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getBDData("version");
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"] > previousVersion) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]) this.showChangelogModal(_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdChangelog"]);
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].setBDData("version", _0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]);
|
|
}
|
|
|
|
_emojiModule__WEBPACK_IMPORTED_MODULE_14__["default"].start();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchSocial.bind(this), "BD Social Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildPills.bind(this), "BD Guild Pills Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildListItems.bind(this), "BD Guild List Items Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchGuildSeparator.bind(this), "BD Guild Separator Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMessageHeader.bind(this), "BD Badge Chat Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchMemberList.bind(this), "BD Badge Member List Patch")();
|
|
_utils__WEBPACK_IMPORTED_MODULE_1__["default"].suppressErrors(this.patchAttachment.bind(this), "LC Plugin Certifier Patch")();
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].haveInstalledDefault) {
|
|
let alert = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert("First Installation", "As it is the first time you install Lightcord, We added two default themes and one default plugin in your plugin/theme folder. Check it in the Plugin/Theme settings.");
|
|
await new Promise(resolve => {
|
|
alert.onClose(resolve);
|
|
});
|
|
}
|
|
|
|
const logo = document.querySelector("#app-mount > div.typeWindows-1za-n7.withFrame-haYltI.titleBar-AC4pGV.horizontalReverse-3tRjY7.flex-1O1GKY.directionRowReverse-m8IjIq.justifyStart-2NDFzi.alignStretch-DpGPf3.da-typeWindows.da-withFrame.da-titleBar.da-horizontalReverse.da-flex.da-directionRowReverse.da-justifyStart.da-alignStretch > div.wordmarkWindows-1v0lYD.wordmark-2iDDfm.da-wordmarkWindows.da-wordmark");
|
|
|
|
if (logo) {
|
|
logo.style.top = "3px";
|
|
logo.innerHTML = `<svg xmlns="http://www.w3.org/2000/svg" height="10" width="70" viewBox="0 0 72.54 10" style="margin-left: -5px, margin-top: 10px">
|
|
<path fill="currentColor" d="M44.81,9.67V6.33c0-1.21,2.13-1.49,2.78-.28l2-.81A3.53,3.53,0,0,0,46.2,3c-1.92,0-3.81,1.13-3.81,3.33V9.67c0,2.21,1.89,3.33,3.77,3.33a3.87,3.87,0,0,0,3.45-2.18l-2.12-1C47,11.17,44.81,10.85,44.81,9.67ZM10.68,12.89h2.41V3.17H10.68ZM71.76,3.14H68.19V7.23L70.57,9.4v-4h1.27c.81,0,1.21.41,1.21,1v3c0,.63-.38,1.05-1.21,1.05H68.18v2.31h3.57c1.92,0,3.72-1,3.72-3.2V6.39C75.48,4.13,73.68,3.14,71.76,3.14ZM54.22,3c-2,0-4,1.1-4,3.34V9.66c0,2.23,2,3.34,4,3.34s3.95-1.11,3.95-3.34V6.34C58.19,4.11,56.2,3,54.22,3Zm1.55,6.66c0,.7-.78,1.06-1.54,1.06s-1.55-.35-1.55-1.06V6.34c0-.72.75-1.1,1.5-1.1s1.59.35,1.59,1.1ZM66.84,6.34c0-2.29-1.58-3.2-3.55-3.2H59.46v9.73h2.45V9.77h.43l2.22,3.09h3L65,9.52C66.13,9.15,66.84,8.14,66.84,6.34ZM63.33,7.65H61.91V5.43h1.42A1.11,1.11,0,1,1,63.33,7.65ZM29.83,13h2.42V3.06H29.83V6.73l-3,0V3.09H24.7v9.78h2.14V8.68l3,0ZM17.16,9.76V6.42c0-1.21,2.13-1.49,2.78-.28l2-.81a3.55,3.55,0,0,0-3.36-2.24c-1.92,0-3.81,1.13-3.81,3.33V9.76c0,2.21,2,3.15,3.9,3.15s3.58-1,3.58-3V7.58H18.79l0,1.36H20.3v.77C20.3,10.92,17.16,10.94,17.16,9.76Z" transform="translate(-2.93 -3)"/>
|
|
<polygon fill="currentColor" points="35.91 0.06 38.43 0.06 38.43 1.84 35.92 1.81 35.97 10 33.55 10 33.49 1.75 30.98 1.74 30.98 0.06 33.49 0.06 35.91 0.06"/>
|
|
<polygon fill="currentColor" points="0 9.97 6.5 10 6.5 7.63 2.41 7.63 2.41 0.26 0 2.26 0 9.97"/>
|
|
</svg>`;
|
|
}
|
|
};
|
|
|
|
Core.prototype.patchAttributes = async function () {
|
|
let attribsPatchs = [];
|
|
|
|
this.cancelPatchAttributes = function () {
|
|
attribsPatchs.forEach(e => e());
|
|
};
|
|
|
|
while (!_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100)); // TODO: try to patch correctly the user popout on a next update
|
|
|
|
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "DiscordTag").then(DiscordTag => {
|
|
let DiscordTagComp = DiscordTag.default;
|
|
|
|
DiscordTag.default = function (props) {
|
|
let returnValue = DiscordTagComp(props);
|
|
let id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
|
|
let badgeDiv = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
|
|
style: {
|
|
display: "inline",
|
|
marginTop: "5px"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("span", {
|
|
id: "badges-" + id,
|
|
key: "badges-" + id,
|
|
style: {
|
|
display: "inherit"
|
|
}
|
|
}));
|
|
let children = [returnValue];
|
|
|
|
if (props.user.id === "249746236008169473") {
|
|
// Rauenzi: BandagedBD Developer
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BandagedBD Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-chat-badge",
|
|
href: "https://github.com/rauenzi/BetterDiscordApp",
|
|
title: "BandagedBD",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
} else if (props.user.id === "696481194443014174" || props.user.id === "696003456611385396") {
|
|
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-chat-badge",
|
|
href: "https://github.com/Lightcord/Lightcord",
|
|
title: "Lightcord",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
}
|
|
|
|
children.push(badgeDiv);
|
|
let div = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
|
|
style: {
|
|
display: "block"
|
|
}
|
|
}, children);
|
|
applyBadges(id, props.user, false);
|
|
return div;
|
|
};
|
|
});
|
|
attribsPatchs.push(_utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].MessageComponent, "default", {
|
|
after: data => {
|
|
if (data.methodArguments[0].childrenMessageContent.props.message) {
|
|
// this can be a blocked message (not opened)
|
|
data.returnValue.props["data-message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id;
|
|
}
|
|
}
|
|
}));
|
|
/*
|
|
attribsPatchs.push(Utils.monkeyPatch(v2.MessageComponent, "default", {after: (data) => {
|
|
data.returnValue.props["message-id"] = data.methodArguments[0].childrenMessageContent.props.message.id
|
|
}}))*/
|
|
};
|
|
|
|
Core.prototype.checkForGuilds = function () {
|
|
let timesChecked = 0;
|
|
return new Promise(resolve => {
|
|
const checkForGuilds = function () {
|
|
const wrapper = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.wrapper.split(" ")[0];
|
|
if (document.querySelectorAll(`.${wrapper}`).length > 0) timesChecked++;
|
|
const guild = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.listItem.split(" ")[0];
|
|
const blob = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].guildClasses.blobContainer.split(" ")[0];
|
|
if (document.querySelectorAll(`.${wrapper} .${guild} .${blob}`).length > 0) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);else if (timesChecked >= 50) return resolve(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].deferLoaded = true);
|
|
setTimeout(checkForGuilds, 100);
|
|
};
|
|
|
|
if (document.readyState != "loading") setTimeout(checkForGuilds, 100);
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
setTimeout(checkForGuilds, 100);
|
|
});
|
|
});
|
|
};
|
|
|
|
Core.prototype.injectExternals = async function () {// No externals
|
|
};
|
|
|
|
Core.prototype.initSettings = function () {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].initialize();
|
|
|
|
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings") && !_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
|
|
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("settings")) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]);
|
|
}
|
|
|
|
if (!_dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].getSettingGroup("rpc")) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultRPC"]);
|
|
}
|
|
|
|
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
|
|
} else {
|
|
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].loadSettings();
|
|
|
|
for (const setting in _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"]) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] == undefined) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting] = _0globals__WEBPACK_IMPORTED_MODULE_0__["defaultCookie"][setting];
|
|
_settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].saveSettings();
|
|
}
|
|
}
|
|
}
|
|
|
|
window.Lightcord.Api.ensureExported(e => e.default && e.default.prototype && e.default.prototype.getPredicateSections).then(settingModule => {
|
|
let getPredicateSections = settingModule.default.prototype.getPredicateSections;
|
|
|
|
settingModule.default.prototype.getPredicateSections = function () {
|
|
let result = getPredicateSections.call(this, ...arguments);
|
|
if (!result[1]) return result;
|
|
|
|
if (result[1].section === "My Account") {
|
|
// user settings, not guild settings
|
|
let poped = [];
|
|
poped.push(result.pop());
|
|
poped.push(result.pop());
|
|
poped.push(result.pop());
|
|
poped.push(result.pop());
|
|
result.push(..._settingsPanel__WEBPACK_IMPORTED_MODULE_3__["default"].renderSidebar(this));
|
|
|
|
while (poped[0]) {
|
|
result.push(poped.pop());
|
|
}
|
|
}
|
|
|
|
return result;
|
|
};
|
|
});
|
|
};
|
|
|
|
let classNameLayer;
|
|
let classNameSocialLinks;
|
|
let classNameModal;
|
|
|
|
Core.prototype.initObserver = function () {
|
|
const mainObserver = new MutationObserver(mutations => {
|
|
for (let i = 0, mlen = mutations.length; i < mlen; i++) {
|
|
const mutation = mutations[i];
|
|
if (typeof _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"] !== "undefined") _pluginModule__WEBPACK_IMPORTED_MODULE_4__["default"].rawObserver(mutation); // if there was nothing added, skip
|
|
|
|
if (!mutation.addedNodes.length || !(mutation.addedNodes[0] instanceof Element)) continue;
|
|
const node = mutation.addedNodes[0];
|
|
if (!classNameLayer) classNameLayer = BDModules.get(e => e.layer && typeof e.layer === "string" && e.animating)[0].layer;
|
|
if (!classNameSocialLinks) classNameSocialLinks = BDModules.get(e => e.socialLinks && typeof e.socialLinks === "string")[0].socialLinks;
|
|
if (!classNameModal) classNameModal = BDModules.get(e => e.modal && typeof e.modal === "string" && e.inner && typeof e.inner === "string" && !e.responsiveWidthMobile)[0].modal;
|
|
|
|
if (node.classList.contains(classNameLayer)) {
|
|
if (node.getAttribute("aria-label") === "GUILD_SETTINGS") {
|
|
node.setAttribute("layer-id", "server-settings");
|
|
node.setAttribute("id", "server-settings");
|
|
}
|
|
|
|
if (node.getElementsByClassName(classNameSocialLinks).length) {
|
|
node.setAttribute("layer-id", "user-settings");
|
|
node.setAttribute("id", "user-settings");
|
|
}
|
|
}
|
|
|
|
if (node.parentElement == document.body && node.querySelector("#ace_settingsmenu")) node.id = "ace_settingsmenu_container"; // Emoji Picker
|
|
//node.getElementsByClassName("emojiPicker-3m1S-j").length && !node.querySelector(".emojiPicker-3m1S-j").parentElement.classList.contains("animatorLeft-1EQxU0")
|
|
//if (node.classList.contains(classNameLayer2) && node.getElementsByClassName(classNameEmojiPicker).length && !node.querySelector("."+classNameEmojiPicker).parentElement.classList.contains(classNameAnimatorLeft)) quickEmoteMenu.obsCallback(node);
|
|
}
|
|
});
|
|
mainObserver.observe(document, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
};
|
|
|
|
Core.prototype.showChangelogModal = function (options = {}) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].showChangelogModal(options);
|
|
};
|
|
|
|
Core.prototype.alert = function (title, content) {
|
|
return _utils__WEBPACK_IMPORTED_MODULE_1__["default"].alert(title, content);
|
|
};
|
|
|
|
Core.prototype.patchSocial = function () {
|
|
if (this.socialPatch) return;
|
|
const TabBar = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "TabBar");
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!TabBar) return;
|
|
this.socialPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(TabBar.prototype, "render", {
|
|
after: data => {
|
|
const children = data.returnValue.props.children;
|
|
if (!children || !children.length || children.length < 3) return;
|
|
if (children[children.length - 3].type.displayName !== "Separator") return;
|
|
if (!children[children.length - 2].type.toString().includes("socialLinks")) return;
|
|
|
|
if (Anchor) {
|
|
let socialModule1 = BDModules.get(e => e.socialLinks)[0];
|
|
const original = children[children.length - 2].type;
|
|
|
|
const newOne = function () {
|
|
const returnVal = original(...arguments);
|
|
returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-social-link " + socialModule1.link,
|
|
href: "https://github.com/Lightcord/Lightcord",
|
|
title: "Lightcord",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
|
size: "16px",
|
|
className: "bd-social-logo"
|
|
}))));
|
|
returnVal.props.children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BandagedBD"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-social-link " + socialModule1.link,
|
|
href: "https://github.com/rauenzi/BetterDiscordApp",
|
|
title: "BandagedBD",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
size: "16px",
|
|
className: "bd-social-logo"
|
|
}))));
|
|
return returnVal;
|
|
};
|
|
|
|
children[children.length - 2].type = newOne;
|
|
}
|
|
|
|
let [classNameColorMuted, sizes, classNameVersionHash] = [BDModules.get(e => e.colorMuted)[0].colorMuted, BDModules.get(e => e.size32)[0], BDModules.get(e => e.versionHash)[0].versionHash];
|
|
const versionHash = `(${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash ? _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].hash.substring(0, 7) : _0globals__WEBPACK_IMPORTED_MODULE_0__["bdConfig"].branch})`;
|
|
const additional = [_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
className: `${classNameColorMuted} ${sizes.size12}`
|
|
}, `Lightcord ${electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").version} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
|
|
className: classNameVersionHash + " da-versionHash"
|
|
}, `(${(electron__WEBPACK_IMPORTED_MODULE_15__["remote"].getGlobal("BuildInfo").commit || "Unknown").slice(0, 7)})`)), _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
className: `${classNameColorMuted} ${sizes.size12}`
|
|
}, `BBD ${_0globals__WEBPACK_IMPORTED_MODULE_0__["bbdVersion"]} `, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
|
|
className: classNameVersionHash + " da-versionHash"
|
|
}, versionHash))];
|
|
const originalVersions = children[children.length - 1].type;
|
|
|
|
children[children.length - 1].type = function () {
|
|
const returnVal = originalVersions(...arguments);
|
|
returnVal.props.children.splice(1, 0, additional);
|
|
return returnVal;
|
|
};
|
|
}
|
|
});
|
|
};
|
|
|
|
const getGuildClasses = function () {
|
|
const guildsWrapper = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("wrapper", "unreadMentionsBar");
|
|
const guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("guildsError", "selected");
|
|
const pill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("blobContainer");
|
|
return Object.assign({}, guildsWrapper, guilds, pill);
|
|
};
|
|
|
|
Core.prototype.patchGuildListItems = function () {
|
|
if (this.guildListItemsPatch) return;
|
|
const GuildClasses = getGuildClasses();
|
|
const listItemClass = GuildClasses.listItem.split(" ")[0];
|
|
const blobClass = GuildClasses.blobContainer.split(" ")[0];
|
|
const reactInstance = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].getInternalInstance(document.querySelector(`.${listItemClass} .${blobClass}`).parentElement);
|
|
const GuildComponent = reactInstance.return.type;
|
|
if (!GuildComponent) return;
|
|
this.guildListItemsPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(GuildComponent.prototype, "render", {
|
|
after: data => {
|
|
if (data.returnValue && data.thisObject) {
|
|
const returnValue = data.returnValue;
|
|
const guildData = data.thisObject.props;
|
|
let className = returnValue.props.className;
|
|
className += " bd-guild";
|
|
if (guildData.unread) className += " bd-unread";
|
|
if (guildData.selected) className += " bd-selected";
|
|
if (guildData.audio) className += " bd-audio";
|
|
if (guildData.video) className += " bd-video";
|
|
if (guildData.badge) className += " bd-badge";
|
|
if (guildData.animatable) className += " bd-animatable";
|
|
returnValue.props.className = className;
|
|
return returnValue;
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchGuildPills = function () {
|
|
if (this.guildPillPatch) return;
|
|
const guildPill = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.default && !m.default.displayName && m.default.toString && m.default.toString().includes("translate3d"));
|
|
if (!guildPill) return;
|
|
this.guildPillPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(guildPill, "default", {
|
|
after: data => {
|
|
const props = data.methodArguments[0];
|
|
if (props.unread) data.returnValue.props.className += " bd-unread";
|
|
if (props.selected) data.returnValue.props.className += " bd-selected";
|
|
if (props.hovered) data.returnValue.props.className += " bd-hovered";
|
|
return data.returnValue;
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchGuildSeparator = function () {
|
|
if (this.guildSeparatorPatch) return;
|
|
const Guilds = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("Guilds");
|
|
const guildComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("renderListItem");
|
|
if (!guildComponents || !Guilds) return;
|
|
|
|
const GuildSeparator = function () {
|
|
const returnValue = guildComponents.Separator(...arguments);
|
|
returnValue.props.className += " bd-guild-separator";
|
|
return returnValue;
|
|
};
|
|
|
|
this.guildSeparatorPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Guilds.prototype, "render", {
|
|
after: data => {
|
|
data.returnValue.props.children[1].props.children[3].type = GuildSeparator;
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchAttachment = function () {
|
|
if (this.AttachmentPatch) return;
|
|
const Attachment = BDModules.get(e => e.default && e.default.displayName === "Attachment")[0]; // temporary
|
|
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!Anchor || !Attachment || !Attachment.default) return;
|
|
this.AttachmentPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(Attachment, "default", {
|
|
after: data => {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) return;
|
|
const attachment = data.methodArguments[0] || null;
|
|
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
|
|
if (!children || !attachment || !attachment.url) return;
|
|
if (!Array.isArray(children)) return;
|
|
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("span", {
|
|
id: "certified-" + id
|
|
}));
|
|
_pluginCertifier__WEBPACK_IMPORTED_MODULE_12__["default"].patch(attachment, "certified-" + id);
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.patchMessageHeader = function () {
|
|
if (this.messageHeaderPatch) return;
|
|
const MessageHeader = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByProps("MessageTimestamp");
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!Anchor || !MessageHeader || !MessageHeader.default) return;
|
|
this.messageHeaderPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MessageHeader, "default", {
|
|
after: data => {
|
|
const author = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "message.author"); // const header = Utils.getNestedProp(data.returnValue, "props.children.1.props");
|
|
|
|
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children.1.props.children.1.props.children");
|
|
if (!children || !author || !author.id) return; // if (header && header.className) header.className += " "
|
|
|
|
if (!Array.isArray(children)) return;
|
|
|
|
if (author.id === "249746236008169473") {
|
|
// Rauenzi: BandagedBD Developer
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BandagedBD Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-chat-badge",
|
|
href: "https://github.com/rauenzi/BetterDiscordApp",
|
|
title: "BandagedBD",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
} else if (author.id === "696481194443014174" || author.id === "696003456611385396") {
|
|
// Not Thomiz: Lightcord Developer, Phorcys: Lightcord Developer
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-chat-badge",
|
|
href: "https://github.com/Lightcord/Lightcord",
|
|
title: "Lightcord",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
}
|
|
|
|
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
|
|
id: "badges-" + id,
|
|
style: {
|
|
display: "inline"
|
|
}
|
|
}));
|
|
applyBadges(id, author, true);
|
|
}
|
|
});
|
|
};
|
|
|
|
function applyBadges(id, user, chat) {
|
|
process.nextTick(() => {
|
|
const div = document.getElementById("badges-" + id);
|
|
if (!div || div.childNodes.length > 0) return;
|
|
if (div.childNodes.length) return;
|
|
let blockDiv = document.createElement("div");
|
|
blockDiv.style.display = "none";
|
|
div.appendChild(blockDiv);
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
_distant__WEBPACK_IMPORTED_MODULE_13__["default"].getBadges(user.id).then(badges => {
|
|
badges.forEach(badge => {
|
|
const props = {
|
|
svg: {
|
|
size: "16px",
|
|
className: "bd-logo",
|
|
width: "16px"
|
|
}
|
|
};
|
|
badge.scopes.forEach(scope => {
|
|
if (scope === "user") {
|
|
// require user
|
|
props.user = user;
|
|
}
|
|
});
|
|
|
|
if (!badge.href) {
|
|
props.Anchor = Anchor;
|
|
props.href = {
|
|
className: chat ? "bd-chat-badge" : "bd-member-badge",
|
|
title: badge.name,
|
|
target: "_blank"
|
|
};
|
|
}
|
|
|
|
const element = _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: badge.name
|
|
}, badge.href ? _v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(Anchor, {
|
|
href: badge.href,
|
|
className: chat ? "bd-chat-badge" : "bd-member-badge",
|
|
title: badge.name,
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props)) : _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(badge.component, props));
|
|
const div2 = document.createElement("div");
|
|
_v2__WEBPACK_IMPORTED_MODULE_2__["default"].reactDom.render(element, div2);
|
|
div2.childNodes.forEach(node => {
|
|
div.appendChild(node);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
|
|
Core.prototype.patchMemberList = function () {
|
|
if (this.memberListPatch) return;
|
|
const MemberListItem = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].findByDisplayName("MemberListItem");
|
|
const Anchor = _webpackModules__WEBPACK_IMPORTED_MODULE_7__["default"].find(m => m.displayName == "Anchor");
|
|
if (!Anchor || !MemberListItem || !MemberListItem.prototype || !MemberListItem.prototype.renderDecorators) return;
|
|
this.memberListPatch = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(MemberListItem.prototype, "renderDecorators", {
|
|
after: data => {
|
|
const user = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.thisObject, "props.user");
|
|
const children = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.returnValue, "props.children");
|
|
if (!children || !user || !user.id) return; // if (header && header.className) header.className += " "
|
|
|
|
if (!Array.isArray(children)) return;
|
|
|
|
if (user.id === "249746236008169473") {
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "BandagedBD Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-member-badge",
|
|
href: "https://github.com/rauenzi/BetterDiscordApp",
|
|
title: "BandagedBD",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_bdLogo__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
} else if (user.id === "696481194443014174" || user.id === "696003456611385396") {
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_10__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Lightcord Developer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(Anchor, {
|
|
className: "bd-member-badge",
|
|
href: "https://github.com/Lightcord/Lightcord",
|
|
title: "Lightcord",
|
|
target: "_blank"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(_svg_lightcord__WEBPACK_IMPORTED_MODULE_11__["default"], {
|
|
size: "16px",
|
|
className: "bd-logo"
|
|
}))));
|
|
}
|
|
|
|
const id = Object(_distant__WEBPACK_IMPORTED_MODULE_13__["uuidv4"])();
|
|
children.push(_v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement("div", {
|
|
id: "badges-" + id
|
|
}));
|
|
applyBadges(id, user, false);
|
|
}
|
|
});
|
|
};
|
|
|
|
Core.prototype.updateInjector = async function () {
|
|
// There will never be an injection path, so we do not need the code below.
|
|
// Insert comments so it will be erased when production.
|
|
const injectionPath = _dataStore__WEBPACK_IMPORTED_MODULE_6__["default"].injectionPath;
|
|
if (!injectionPath) return false;
|
|
/*
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const rmrf = require("rimraf");
|
|
const yauzl = require("yauzl");
|
|
const mkdirp = require("mkdirp");
|
|
const request = require("request");
|
|
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.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.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.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.log("InjectorUpdate", `Renaming ${path.basename(extractedFolder)} to ${folderName}`);
|
|
success = await new Promise(resolve => fs.rename(extractedFolder, injectionPath, err => resolve(!err)));
|
|
if (!success) {
|
|
Utils.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.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.log("InjectorUpdate", "Injector Updated!");
|
|
return success;*/
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new Core());
|
|
/**
|
|
* Don't expose core - could be dangerous for now
|
|
*/
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/dataStore.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/modules/dataStore.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __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";
|
|
let dataPath = "";
|
|
if (process.platform === "win32") dataPath = process.env.APPDATA;else if (process.platform === "darwin") dataPath = path.join(process.env.HOME, "Library", "Preferences");else dataPath = process.env.XDG_CONFIG_HOME ? process.env.XDG_CONFIG_HOME : path.join(process.env.HOME, ".config");
|
|
dataPath = path.join(dataPath, "BetterDiscord");
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DataStore {
|
|
constructor() {
|
|
this.data = {
|
|
settings: {
|
|
stable: {},
|
|
canary: {},
|
|
ptb: {}
|
|
}
|
|
};
|
|
this.pluginData = {};
|
|
window.Lightcord.BetterDiscord.DataStore = this;
|
|
}
|
|
|
|
initialize() {
|
|
try {
|
|
if (!fs.existsSync(this.BDFile)) fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "utf-8");
|
|
const data = JSON.parse(fs.readFileSync(this.BDFile, "utf-8"));
|
|
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_0__["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(dataPath, "bdstorage.json"));
|
|
}
|
|
|
|
get settingsFile() {
|
|
return this._settingsFile || (this._settingsFile = path.resolve(dataPath, "bdsettings.json"));
|
|
}
|
|
|
|
getPluginFile(pluginName) {
|
|
return path.resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["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), "utf-8");
|
|
}
|
|
|
|
getBDData(key) {
|
|
return this.data[key] || "";
|
|
}
|
|
|
|
setBDData(key, value) {
|
|
this.data[key] = value;
|
|
fs.writeFileSync(this.BDFile, JSON.stringify(this.data, null, 4), "utf-8");
|
|
}
|
|
|
|
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), "utf-8");
|
|
}
|
|
|
|
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), "utf-8");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/devMode.js":
|
|
/*!********************************!*\
|
|
!*** ./src/modules/devMode.js ***!
|
|
\********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DevMode {
|
|
constructor() {
|
|
this.debugListener = this.debugListener.bind(this);
|
|
this.copySelectorListener = this.copySelectorListener.bind(this);
|
|
}
|
|
|
|
start() {
|
|
this.startDebugListener();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) this.startCopySelector();
|
|
}
|
|
|
|
stop() {
|
|
this.stopDebugListener();
|
|
this.stopCopySelector();
|
|
}
|
|
|
|
startDebugListener() {
|
|
this.stopDebugListener();
|
|
document.addEventListener("keydown", this.debugListener);
|
|
}
|
|
|
|
stopDebugListener() {
|
|
document.removeEventListener("keydown", this.debugListener);
|
|
}
|
|
|
|
startCopySelector() {
|
|
this.stopCopySelector();
|
|
document.addEventListener("contextmenu", this.copySelectorListener);
|
|
}
|
|
|
|
stopCopySelector() {
|
|
document.removeEventListener("contextmenu", this.copySelectorListener);
|
|
}
|
|
|
|
debugListener(e) {
|
|
if (e.which === 119 || e.which == 118) {
|
|
//F8
|
|
console.log("%c[%cDevMode%c] %cBreak/Resume", "color: red;", "color: #303030; font-weight:700;", "color:red;", "");
|
|
debugger; // eslint-disable-line no-debugger
|
|
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
}
|
|
}
|
|
|
|
copySelectorListener(e) {
|
|
try {
|
|
e.stopPropagation();
|
|
const selector = this.getSelector(e.target);
|
|
let [classLayer, classItems] = [BDModules.get(e => e.layer && typeof e.layer === "string" && e.disabledPointerEvents)[0], BDModules.get(e => e.menu)[0]];
|
|
|
|
function attach() {
|
|
if (!classItems || !classLayer.layer) return console.log(classItems, classLayer.layer);
|
|
let cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.menu));
|
|
|
|
if (!cm) {
|
|
const container = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].query("#app-mount > ." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classLayer.layerContainer));
|
|
const cmWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classLayer.layer}">`);
|
|
cm = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.menu} ${classItems.styleFlexible} ${classItems.accommodateScrollbar} bd-context-menu" style=""></div>`);
|
|
cmWrap.append(cm);
|
|
container.append(cmWrap);
|
|
cmWrap.style.top = e.clientY + "px";
|
|
cmWrap.style.left = e.clientX + "px";
|
|
cmWrap.setAttribute("role", "menu");
|
|
cmWrap.setAttribute("tabindex", "-1");
|
|
cmWrap.id = "bd-copy-selector-context";
|
|
cmWrap.setAttribute("aria-label", "Copy Selector Actions");
|
|
const scrollerClasses = BDModules.get(e => e.scrollerWrap)[0];
|
|
const scrollerWrap = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${scrollerClasses.scrollerWrap} ${scrollerClasses.scrollerThemed} ${scrollerClasses.themeGhostHairline}"></div>`);
|
|
const scroller = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${BDModules.get(e => e.scroller)[0].scroller} ${classItems.scroller}"></div>`);
|
|
scrollerWrap.append(scroller);
|
|
cm.append(scrollerWrap);
|
|
|
|
const removeCM = function (e) {
|
|
if (e.keyCode && e.keyCode !== 27) return;
|
|
cmWrap.remove();
|
|
document.removeEventListener("click", removeCM);
|
|
document.removeEventListener("contextmenu", removeCM);
|
|
document.removeEventListener("keyup", removeCM);
|
|
};
|
|
|
|
document.addEventListener("click", removeCM);
|
|
document.addEventListener("contextmenu", removeCM);
|
|
document.addEventListener("keyup", removeCM);
|
|
}
|
|
|
|
const cmWrap = cm.parentElement;
|
|
const scroller = cm.childNodes[0].childNodes[0];
|
|
const cmg = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="group"></div>`);
|
|
/**
|
|
* @type {HTMLElement}
|
|
*/
|
|
|
|
const cmi = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.item} ${classItems.labelContainer} ${classItems.colorDefault}" role="menuitem" id="bd-copy-selector-item-cm"></div>`);
|
|
cmi.append(_domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div class="${classItems.label}">Copy Selector</div>`));
|
|
cmi.addEventListener("click", () => {
|
|
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].NativeModule.copy(selector);
|
|
cmWrap.style.display = "none";
|
|
});
|
|
cmi.addEventListener("mouseover", e => {
|
|
let elements = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].queryAll("div[role=menuitem]." + _utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(classItems.focused));
|
|
elements && elements.forEach(elem => elem.classList.remove(classItems.focused));
|
|
cmi.classList.add(classItems.focused);
|
|
});
|
|
cmi.addEventListener("mouseout", e => {
|
|
cmi.classList.remove(classItems.focused);
|
|
});
|
|
cmg.append(cmi);
|
|
|
|
if (scroller.childNodes.length) {
|
|
// apend a separator
|
|
const separator = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].createElement(`<div role="separator" class="${classItems.separator}"></div>`);
|
|
scroller.append(separator);
|
|
}
|
|
|
|
scroller.append(cmg);
|
|
|
|
if (cmWrap.clientHeight < cmWrap.scrollHeight) {
|
|
console.log("overflowing " + cmWrap.style.top);
|
|
cmWrap.style.top = cmWrap.style.top - cmg.clientHeight + "px";
|
|
console.log("overflowing" + cmWrap.style.top);
|
|
}
|
|
}
|
|
|
|
setTimeout(attach, 1);
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
}
|
|
|
|
getSelector(element) {
|
|
if (element.id) return `#${element.id}`;
|
|
/**
|
|
*
|
|
* @param {HTMLElement} el
|
|
*/
|
|
|
|
function fullPath(el) {
|
|
var names = [];
|
|
|
|
while (el.parentNode) {
|
|
if (el.id) {
|
|
names.unshift('#' + el.id);
|
|
break;
|
|
} else {
|
|
if (el == el.ownerDocument.documentElement) names.unshift(el.tagName.toLowerCase() + Array.from(el.classList.entries()).map(e => "." + e).join(""));else {
|
|
for (var c = 1, e = el; e.previousElementSibling; e = e.previousElementSibling, c++);
|
|
|
|
names.unshift(el.tagName.toLowerCase() + (typeof el.className === "string" && el.className || "").split(" ").filter(e => !!e).map(e => "." + e).join("") + ":nth-child(" + c + ")");
|
|
}
|
|
el = el.parentNode;
|
|
}
|
|
}
|
|
|
|
return names.join(" > ");
|
|
}
|
|
|
|
return fullPath(element);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/disableTyping.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/disableTyping.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DisableTyping {
|
|
constructor() {
|
|
window.Lightcord.Api.ensureExported(e => e.default && e.default.startTyping).then(typingModule => {
|
|
let self = this;
|
|
const startTyping = typingModule.default.startTyping;
|
|
|
|
typingModule.default.startTyping = function () {
|
|
if (self.disabled) return startTyping.call(this, ...arguments);
|
|
};
|
|
|
|
const stopTyping = typingModule.default.stopTyping;
|
|
|
|
typingModule.default.stopTyping = function () {
|
|
if (self.disabled) return stopTyping.call(this, ...arguments);
|
|
};
|
|
|
|
this.disabled = true;
|
|
});
|
|
window.Lightcord.BetterDiscord.DisableTyping = this;
|
|
}
|
|
|
|
disable() {
|
|
this.disabled = true;
|
|
}
|
|
|
|
enable() {
|
|
this.disabled = false;
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/distant.js":
|
|
/*!********************************!*\
|
|
!*** ./src/modules/distant.js ***!
|
|
\********************************/
|
|
/*! exports provided: uuidv4, default, Constants, Routes */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "uuidv4", function() { return uuidv4; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Constants", function() { return Constants; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Routes", function() { return Routes; });
|
|
/* harmony import */ var _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../svg/bug_hunter */ "./src/svg/bug_hunter.jsx");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! node-fetch */ "node-fetch");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _svg_circus__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../svg/circus */ "./src/svg/circus.jsx");
|
|
|
|
|
|
|
|
|
|
function uuidv4() {
|
|
// Generate UUID (No crypto rng)
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
var r = Math.random() * 16 | 0,
|
|
v = c == 'x' ? r : r & 0x3 | 0x8;
|
|
return v.toString(16);
|
|
});
|
|
}
|
|
const awaitingBadgesPromises = {};
|
|
let badgesToFetch = [];
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class DistantServer {
|
|
constructor() {
|
|
this._cache = {
|
|
badges: {}
|
|
};
|
|
window.Lightcord.BetterDiscord.DistantServer = this;
|
|
}
|
|
|
|
get cache() {
|
|
return this._cache;
|
|
}
|
|
|
|
set cache(data) {
|
|
if (typeof data !== "object" || typeof this._cache !== "object") return this._cache = data;
|
|
return this._cache = Object.assign(this._cache, data);
|
|
}
|
|
/**
|
|
* Get custom badges from the user ID.
|
|
* @param {string} user The user ID
|
|
* @returns {Promise<Constants["badges"]>}
|
|
*/
|
|
|
|
|
|
async getBadges(user) {
|
|
if (this.cache.badges[user]) return this.cache.badges[user];
|
|
if (awaitingBadgesPromises[user]) return awaitingBadgesPromises[user];
|
|
let resolve;
|
|
const newPromise = new Promise(res => resolve = res);
|
|
awaitingBadgesPromises[user] = newPromise;
|
|
const badges = [];
|
|
|
|
for (let badge of Constants.badges) {
|
|
if (badge.defaultUsers.includes(user)) badges.push(badge);
|
|
}
|
|
|
|
const fetchedBadges = await new Promise(resolve => {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_2__["settingsCookie"]["lightcord-5"]) return resolve([]);
|
|
badgesToFetch.push([user, resolve]);
|
|
setTimeout(() => {
|
|
let users = badgesToFetch;
|
|
if (users.length === 0) return;
|
|
badgesToFetch = [];
|
|
handleRequest(Routes.badges, "POST", JSON.stringify(users.map(e => e[0]))).then(async res => {
|
|
if (res.status !== 200) {
|
|
// Couldn't fetch badges: server error
|
|
users.forEach(data => {
|
|
data[1]([]); // resolve no badge fetched
|
|
});
|
|
}
|
|
|
|
const responseBody = await res.json();
|
|
|
|
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_2__["settingsCookie"]["lightcord-5"]) {
|
|
return Promise.reject(new LightcordError("The current settings blocked the request."));
|
|
}
|
|
|
|
return node_fetch__WEBPACK_IMPORTED_MODULE_1___default()(`${Constants.SERVER_URL}/api/v1${route}`, {
|
|
method,
|
|
headers: {
|
|
"CLIENT": "Lightcord",
|
|
"Authorization": window.Lightcord.Api.Authorization || "None::Anonymous"
|
|
},
|
|
...(data ? {
|
|
body: data
|
|
} : {})
|
|
});
|
|
};
|
|
|
|
class LightcordError extends Error {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.name = "LightcordError";
|
|
}
|
|
|
|
}
|
|
|
|
const Constants = {
|
|
SERVER_URL: "https://lightcord.deroku.xyz",
|
|
badges: [// TODO: Add more badges + server side svg
|
|
{
|
|
name: "Lightcord Bug Hunter",
|
|
id: "f04698f5-816b-41e3-bd01-92291193d7a5",
|
|
defaultUsers: ["696481194443014174", "696003456611385396"],
|
|
scopes: [],
|
|
component: _svg_bug_hunter__WEBPACK_IMPORTED_MODULE_0__["default"],
|
|
href: "https://github.com/lightcord/lightcord/wiki/badges#bug_hunter"
|
|
}, {
|
|
name: "Buffoon",
|
|
id: "06904d31-65b4-41ec-a50c-8658bbd1af96",
|
|
defaultUsers: ["389016895543705602", "664600134528663565", "625350657829896224"],
|
|
scopes: [],
|
|
component: _svg_circus__WEBPACK_IMPORTED_MODULE_3__["default"],
|
|
href: "https://youtu.be/EJtb6z-dlT8?t=145"
|
|
}]
|
|
};
|
|
const Routes = {
|
|
badges: `/users/badges`
|
|
};
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/domtools.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/modules/domtools.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DOMTools; });
|
|
/**
|
|
* Copyright 2018 Zachary Rauen
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining
|
|
* a copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation the
|
|
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is furnished
|
|
* to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
|
|
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
* PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
|
|
* CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
|
|
* OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
*
|
|
* From: https://github.com/rauenzi/BDPluginLibrary
|
|
*/
|
|
|
|
/**
|
|
* @interface
|
|
* @name Offset
|
|
* @property {number} top - Top offset of the target element.
|
|
* @property {number} right - Right offset of the target element.
|
|
* @property {number} bottom - Bottom offset of the target element.
|
|
* @property {number} left - Left offset of the target element.
|
|
* @property {number} height - Outer height of the target element.
|
|
* @property {number} width - Outer width of the target element.
|
|
*/
|
|
|
|
/**
|
|
* Function that automatically removes added listener.
|
|
* @callback module:DOMTools~CancelListener
|
|
*/
|
|
class DOMTools {
|
|
static escapeID(id) {
|
|
return id.replace(/^[^a-z]+|[^\w-]+/gi, "-");
|
|
}
|
|
/**
|
|
* Adds a style to the document.
|
|
* @param {string} id - identifier to use as the element id
|
|
* @param {string} css - css to add to the document
|
|
*/
|
|
|
|
|
|
static addStyle(id, css) {
|
|
document.head.append(DOMTools.createElement(`<style id="${id}">${css}</style>`));
|
|
}
|
|
/**
|
|
* Removes a style from the document.
|
|
* @param {string} id - original identifier used
|
|
*/
|
|
|
|
|
|
static removeStyle(id) {
|
|
const element = document.getElementById(id);
|
|
if (element) element.remove();
|
|
}
|
|
/**
|
|
* Adds/requires a remote script to be loaded
|
|
* @param {string} id - identifier to use for this script
|
|
* @param {string} url - url from which to load the script
|
|
* @returns {Promise} promise that resolves when the script is loaded
|
|
*/
|
|
|
|
|
|
static addScript(id, url) {
|
|
return new Promise(resolve => {
|
|
const script = document.createElement("script");
|
|
script.id = id;
|
|
script.src = url;
|
|
script.type = "text/javascript";
|
|
script.onload = resolve;
|
|
document.head.append(script);
|
|
});
|
|
}
|
|
/**
|
|
* Removes a remote script from the document.
|
|
* @param {string} id - original identifier used
|
|
*/
|
|
|
|
|
|
static removeScript(id) {
|
|
id = this.escapeID(id);
|
|
const element = document.getElementById(id);
|
|
if (element) element.remove();
|
|
} // https://javascript.info/js-animation
|
|
|
|
|
|
static animate({
|
|
timing = _ => _,
|
|
update,
|
|
duration
|
|
}) {
|
|
const start = performance.now();
|
|
requestAnimationFrame(function animate(time) {
|
|
// timeFraction goes from 0 to 1
|
|
let timeFraction = (time - start) / duration;
|
|
if (timeFraction > 1) timeFraction = 1; // calculate the current animation state
|
|
|
|
const progress = timing(timeFraction);
|
|
update(progress); // draw it
|
|
|
|
if (timeFraction < 1) {
|
|
requestAnimationFrame(animate);
|
|
}
|
|
});
|
|
}
|
|
/**
|
|
* This is my shit version of not having to use `$` from jQuery. Meaning
|
|
* that you can pass a selector and it will automatically run {@link module:DOMTools.query}.
|
|
* It also means that you can pass a string of html and it will perform and return `parseHTML`.
|
|
* @see module:DOMTools.parseHTML
|
|
* @see module:DOMTools.query
|
|
* @param {string} selector - Selector to query or HTML to parse
|
|
* @returns {(DocumentFragment|NodeList|HTMLElement)} - Either the result of `parseHTML` or `query`
|
|
*/
|
|
|
|
|
|
static Q(selector) {
|
|
const element = this.parseHTML(selector);
|
|
const isHTML = element instanceof NodeList ? Array.from(element).some(n => n.nodeType === 1) : element.nodeType === 1;
|
|
if (isHTML) return element;
|
|
return this.query(selector);
|
|
}
|
|
/**
|
|
* Essentially a shorthand for `document.querySelector`. If the `baseElement` is not provided
|
|
* `document` is used by default.
|
|
* @param {string} selector - Selector to query
|
|
* @param {Element} [baseElement] - Element to base the query from
|
|
* @returns {(Element|null)} - The found element or null if not found
|
|
*/
|
|
|
|
|
|
static query(selector, baseElement) {
|
|
if (!baseElement) baseElement = document;
|
|
return baseElement.querySelector(selector);
|
|
}
|
|
/**
|
|
* Essentially a shorthand for `document.querySelectorAll`. If the `baseElement` is not provided
|
|
* `document` is used by default.
|
|
* @param {string} selector - Selector to query
|
|
* @param {Element} [baseElement] - Element to base the query from
|
|
* @returns {Array<Element>} - Array of all found elements
|
|
*/
|
|
|
|
|
|
static queryAll(selector, baseElement) {
|
|
if (!baseElement) baseElement = document;
|
|
return baseElement.querySelectorAll(selector);
|
|
}
|
|
/**
|
|
* Parses a string of HTML and returns the results. If the second parameter is true,
|
|
* the parsed HTML will be returned as a document fragment {@see https://developer.mozilla.org/en-US/docs/Web/API/DocumentFragment}.
|
|
* This is extremely useful if you have a list of elements at the top level, they can then be appended all at once to another node.
|
|
*
|
|
* If the second parameter is false, then the return value will be the list of parsed
|
|
* nodes and there were multiple top level nodes, otherwise the single node is returned.
|
|
* @param {string} html - HTML to be parsed
|
|
* @param {boolean} [fragment=false] - Whether or not the return should be the raw `DocumentFragment`
|
|
* @returns {(DocumentFragment|NodeList|HTMLElement)} - The result of HTML parsing
|
|
*/
|
|
|
|
|
|
static parseHTML(html, fragment = false) {
|
|
const template = document.createElement("template");
|
|
template.innerHTML = html;
|
|
const node = template.content.cloneNode(true);
|
|
if (fragment) return node;
|
|
return node.childNodes.length > 1 ? node.childNodes : node.childNodes[0];
|
|
}
|
|
/** Alternate name for {@link module:DOMTools.parseHTML} */
|
|
|
|
|
|
static createElement(html, fragment = false) {
|
|
return this.parseHTML(html, fragment);
|
|
}
|
|
/**
|
|
* Takes a string of html and escapes it using the brower's own escaping mechanism.
|
|
* @param {String} html - html to be escaped
|
|
*/
|
|
|
|
|
|
static escapeHTML(html) {
|
|
const textNode = document.createTextNode("");
|
|
const spanElement = document.createElement("span");
|
|
spanElement.append(textNode);
|
|
textNode.nodeValue = html;
|
|
return spanElement.innerHTML;
|
|
}
|
|
/**
|
|
* Adds a list of classes from the target element.
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {...string} classes - Names of classes to add
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static addClass(element, ...classes) {
|
|
classes = classes.flat().filter(c => c);
|
|
|
|
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
|
|
|
|
classes = classes.flat().filter(c => c);
|
|
element.classList.add(...classes);
|
|
return element;
|
|
}
|
|
/**
|
|
* Removes a list of classes from the target element.
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {...string} classes - Names of classes to remove
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static removeClass(element, ...classes) {
|
|
for (let c = 0; c < classes.length; c++) classes[c] = classes[c].toString().split(" ");
|
|
|
|
classes = classes.flat().filter(c => c);
|
|
element.classList.remove(...classes);
|
|
return element;
|
|
}
|
|
/**
|
|
* When only one argument is present: Toggle class value;
|
|
* i.e., if class exists then remove it and return false, if not, then add it and return true.
|
|
* When a second argument is present:
|
|
* If the second argument evaluates to true, add specified class value, and if it evaluates to false, remove it.
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {string} classname - Name of class to toggle
|
|
* @param {boolean} [indicator] - Optional indicator for if the class should be toggled
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static toggleClass(element, classname, indicator) {
|
|
classname = classname.toString().split(" ").filter(c => c);
|
|
if (typeof indicator !== "undefined") classname.forEach(c => element.classList.toggle(c, indicator));else classname.forEach(c => element.classList.toggle(c));
|
|
return element;
|
|
}
|
|
/**
|
|
* Checks if an element has a specific class
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {string} classname - Name of class to check
|
|
* @returns {boolean} - `true` if the element has the class, `false` otherwise.
|
|
*/
|
|
|
|
|
|
static hasClass(element, classname) {
|
|
return classname.toString().split(" ").filter(c => c).every(c => element.classList.contains(c));
|
|
}
|
|
/**
|
|
* Replaces one class with another
|
|
* @param {Element} element - Element to edit classes of
|
|
* @param {string} oldName - Name of class to replace
|
|
* @param {string} newName - New name for the class
|
|
* @returns {Element} - `element` to allow for chaining
|
|
*/
|
|
|
|
|
|
static replaceClass(element, oldName, newName) {
|
|
element.classList.replace(oldName, newName);
|
|
return element;
|
|
}
|
|
/**
|
|
* Appends `thisNode` to `thatNode`
|
|
* @param {Node} thisNode - Node to be appended to another node
|
|
* @param {Node} thatNode - Node for `thisNode` to be appended to
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static appendTo(thisNode, thatNode) {
|
|
if (typeof thatNode == "string") thatNode = this.query(thatNode);
|
|
if (!thatNode) return null;
|
|
thatNode.append(thisNode);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Prepends `thisNode` to `thatNode`
|
|
* @param {Node} thisNode - Node to be prepended to another node
|
|
* @param {Node} thatNode - Node for `thisNode` to be prepended to
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static prependTo(thisNode, thatNode) {
|
|
if (typeof thatNode == "string") thatNode = this.query(thatNode);
|
|
if (!thatNode) return null;
|
|
thatNode.prepend(thisNode);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Insert after a specific element, similar to jQuery's `thisElement.insertAfter(otherElement)`.
|
|
* @param {Node} thisNode - The node to insert
|
|
* @param {Node} targetNode - Node to insert after in the tree
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static insertAfter(thisNode, targetNode) {
|
|
targetNode.parentNode.insertBefore(thisNode, targetNode.nextSibling);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Insert after a specific element, similar to jQuery's `thisElement.after(newElement)`.
|
|
* @param {Node} thisNode - The node to insert
|
|
* @param {Node} newNode - Node to insert after in the tree
|
|
* @returns {Node} - `thisNode` to allow for chaining
|
|
*/
|
|
|
|
|
|
static after(thisNode, newNode) {
|
|
thisNode.parentNode.insertBefore(newNode, thisNode.nextSibling);
|
|
return thisNode;
|
|
}
|
|
/**
|
|
* Gets the next sibling element that matches the selector.
|
|
* @param {Element} element - Element to get the next sibling of
|
|
* @param {string} [selector=""] - Optional selector
|
|
* @returns {Element} - The sibling element
|
|
*/
|
|
|
|
|
|
static next(element, selector = "") {
|
|
return selector ? element.querySelector("+ " + selector) : element.nextElementSibling;
|
|
}
|
|
/**
|
|
* Gets all subsequent siblings.
|
|
* @param {Element} element - Element to get next siblings of
|
|
* @returns {NodeList} - The list of siblings
|
|
*/
|
|
|
|
|
|
static nextAll(element) {
|
|
return element.querySelectorAll("~ *");
|
|
}
|
|
/**
|
|
* Gets the subsequent siblings until an element matches the selector.
|
|
* @param {Element} element - Element to get the following siblings of
|
|
* @param {string} selector - Selector to stop at
|
|
* @returns {Array<Element>} - The list of siblings
|
|
*/
|
|
|
|
|
|
static nextUntil(element, selector) {
|
|
const next = [];
|
|
|
|
while (element.nextElementSibling && !element.nextElementSibling.matches(selector)) next.push(element = element.nextElementSibling);
|
|
|
|
return next;
|
|
}
|
|
/**
|
|
* Gets the previous sibling element that matches the selector.
|
|
* @param {Element} element - Element to get the previous sibling of
|
|
* @param {string} [selector=""] - Optional selector
|
|
* @returns {Element} - The sibling element
|
|
*/
|
|
|
|
|
|
static previous(element, selector = "") {
|
|
const previous = element.previousElementSibling;
|
|
if (selector) return previous && previous.matches(selector) ? previous : null;
|
|
return previous;
|
|
}
|
|
/**
|
|
* Gets all preceeding siblings.
|
|
* @param {Element} element - Element to get preceeding siblings of
|
|
* @returns {NodeList} - The list of siblings
|
|
*/
|
|
|
|
|
|
static previousAll(element) {
|
|
const previous = [];
|
|
|
|
while (element.previousElementSibling) previous.push(element = element.previousElementSibling);
|
|
|
|
return previous;
|
|
}
|
|
/**
|
|
* Gets the preceeding siblings until an element matches the selector.
|
|
* @param {Element} element - Element to get the preceeding siblings of
|
|
* @param {string} selector - Selector to stop at
|
|
* @returns {Array<Element>} - The list of siblings
|
|
*/
|
|
|
|
|
|
static previousUntil(element, selector) {
|
|
const previous = [];
|
|
|
|
while (element.previousElementSibling && !element.previousElementSibling.matches(selector)) previous.push(element = element.previousElementSibling);
|
|
|
|
return previous;
|
|
}
|
|
/**
|
|
* Find which index in children a certain node is. Similar to jQuery's `$.index()`
|
|
* @param {HTMLElement} node - The node to find its index in parent
|
|
* @returns {number} Index of the node
|
|
*/
|
|
|
|
|
|
static indexInParent(node) {
|
|
const children = node.parentNode.childNodes;
|
|
let num = 0;
|
|
|
|
for (let i = 0; i < children.length; i++) {
|
|
if (children[i] == node) return num;
|
|
if (children[i].nodeType == 1) num++;
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
/** Shorthand for {@link module:DOMTools.indexInParent} */
|
|
|
|
|
|
static index(node) {
|
|
return this.indexInParent(node);
|
|
}
|
|
/**
|
|
* Gets the parent of the element if it matches the selector,
|
|
* otherwise returns null.
|
|
* @param {Element} element - Element to get parent of
|
|
* @param {string} [selector=""] - Selector to match parent
|
|
* @returns {(Element|null)} - The sibling element or null
|
|
*/
|
|
|
|
|
|
static parent(element, selector = "") {
|
|
return !selector || element.parentElement.matches(selector) ? element.parentElement : null;
|
|
}
|
|
/**
|
|
* Gets all children of Element that match the selector if provided.
|
|
* @param {Element} element - Element to get all children of
|
|
* @param {string} selector - Selector to match the children to
|
|
* @returns {Array<Element>} - The list of children
|
|
*/
|
|
|
|
|
|
static findChild(element, selector) {
|
|
return element.querySelector(":scope > " + selector);
|
|
}
|
|
/**
|
|
* Gets all children of Element that match the selector if provided.
|
|
* @param {Element} element - Element to get all children of
|
|
* @param {string} selector - Selector to match the children to
|
|
* @returns {Array<Element>} - The list of children
|
|
*/
|
|
|
|
|
|
static findChildren(element, selector) {
|
|
return element.querySelectorAll(":scope > " + selector);
|
|
}
|
|
/**
|
|
* Gets all ancestors of Element that match the selector if provided.
|
|
* @param {Element} element - Element to get all parents of
|
|
* @param {string} [selector=""] - Selector to match the parents to
|
|
* @returns {Array<Element>} - The list of parents
|
|
*/
|
|
|
|
|
|
static parents(element, selector = "") {
|
|
const parents = [];
|
|
if (selector) while (element.parentElement && element.parentElement.closest(selector)) parents.push(element = element.parentElement.closest(selector));else while (element.parentElement) parents.push(element = element.parentElement);
|
|
return parents;
|
|
}
|
|
/**
|
|
* Gets the ancestors until an element matches the selector.
|
|
* @param {Element} element - Element to get the ancestors of
|
|
* @param {string} selector - Selector to stop at
|
|
* @returns {Array<Element>} - The list of parents
|
|
*/
|
|
|
|
|
|
static parentsUntil(element, selector) {
|
|
const parents = [];
|
|
|
|
while (element.parentElement && !element.parentElement.matches(selector)) parents.push(element = element.parentElement);
|
|
|
|
return parents;
|
|
}
|
|
/**
|
|
* Gets all siblings of the element that match the selector.
|
|
* @param {Element} element - Element to get all siblings of
|
|
* @param {string} [selector="*"] - Selector to match the siblings to
|
|
* @returns {Array<Element>} - The list of siblings
|
|
*/
|
|
|
|
|
|
static siblings(element, selector = "*") {
|
|
return Array.from(element.parentElement.children).filter(e => e != element && e.matches(selector));
|
|
}
|
|
/**
|
|
* Sets or gets css styles for a specific element. If `value` is provided
|
|
* then it sets the style and returns the element to allow for chaining,
|
|
* otherwise returns the style.
|
|
* @param {Element} element - Element to set the CSS of
|
|
* @param {string} attribute - Attribute to get or set
|
|
* @param {string} [value] - Value to set for attribute
|
|
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
|
|
*/
|
|
|
|
|
|
static css(element, attribute, value) {
|
|
if (typeof value == "undefined") return global.getComputedStyle(element)[attribute];
|
|
element.style[attribute] = value;
|
|
return element;
|
|
}
|
|
/**
|
|
* Sets or gets the width for a specific element. If `value` is provided
|
|
* then it sets the width and returns the element to allow for chaining,
|
|
* otherwise returns the width.
|
|
* @param {Element} element - Element to set the CSS of
|
|
* @param {string} [value] - Width to set
|
|
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
|
|
*/
|
|
|
|
|
|
static width(element, value) {
|
|
if (typeof value == "undefined") return parseInt(getComputedStyle(element).width);
|
|
element.style.width = value;
|
|
return element;
|
|
}
|
|
/**
|
|
* Sets or gets the height for a specific element. If `value` is provided
|
|
* then it sets the height and returns the element to allow for chaining,
|
|
* otherwise returns the height.
|
|
* @param {Element} element - Element to set the CSS of
|
|
* @param {string} [value] - Height to set
|
|
* @returns {Element|string} - When setting a value, element is returned for chaining, otherwise the value is returned.
|
|
*/
|
|
|
|
|
|
static height(element, value) {
|
|
if (typeof value == "undefined") return parseInt(getComputedStyle(element).height);
|
|
element.style.height = value;
|
|
return element;
|
|
}
|
|
/**
|
|
* Sets the inner text of an element if given a value, otherwise returns it.
|
|
* @param {Element} element - Element to set the text of
|
|
* @param {string} [text] - Content to set
|
|
* @returns {string} - Either the string set by this call or the current text content of the node.
|
|
*/
|
|
|
|
|
|
static text(element, text) {
|
|
if (typeof text == "undefined") return element.textContent;
|
|
return element.textContent = text;
|
|
}
|
|
/**
|
|
* Returns the innerWidth of the element.
|
|
* @param {Element} element - Element to retrieve inner width of
|
|
* @return {number} - The inner width of the element.
|
|
*/
|
|
|
|
|
|
static innerWidth(element) {
|
|
return element.clientWidth;
|
|
}
|
|
/**
|
|
* Returns the innerHeight of the element.
|
|
* @param {Element} element - Element to retrieve inner height of
|
|
* @return {number} - The inner height of the element.
|
|
*/
|
|
|
|
|
|
static innerHeight(element) {
|
|
return element.clientHeight;
|
|
}
|
|
/**
|
|
* Returns the outerWidth of the element.
|
|
* @param {Element} element - Element to retrieve outer width of
|
|
* @return {number} - The outer width of the element.
|
|
*/
|
|
|
|
|
|
static outerWidth(element) {
|
|
return element.offsetWidth;
|
|
}
|
|
/**
|
|
* Returns the outerHeight of the element.
|
|
* @param {Element} element - Element to retrieve outer height of
|
|
* @return {number} - The outer height of the element.
|
|
*/
|
|
|
|
|
|
static outerHeight(element) {
|
|
return element.offsetHeight;
|
|
}
|
|
/**
|
|
* Gets the offset of the element in the page.
|
|
* @param {Element} element - Element to get offset of
|
|
* @return {Offset} - The offset of the element
|
|
*/
|
|
|
|
|
|
static offset(element) {
|
|
return element.getBoundingClientRect();
|
|
}
|
|
|
|
static get listeners() {
|
|
return this._listeners || (this._listeners = {});
|
|
}
|
|
/**
|
|
* This is similar to jQuery's `on` function and can *hopefully* be used in the same way.
|
|
*
|
|
* Rather than attempt to explain, I'll show some example usages.
|
|
*
|
|
* The following will add a click listener (in the `myPlugin` namespace) to `element`.
|
|
* `DOMTools.on(element, "click.myPlugin", () => {console.log("clicked!");});`
|
|
*
|
|
* The following will add a click listener (in the `myPlugin` namespace) to `element` that only fires when the target is a `.block` element.
|
|
* `DOMTools.on(element, "click.myPlugin", ".block", () => {console.log("clicked!");});`
|
|
*
|
|
* The following will add a click listener (without namespace) to `element`.
|
|
* `DOMTools.on(element, "click", () => {console.log("clicked!");});`
|
|
*
|
|
* The following will add a click listener (without namespace) to `element` that only fires once.
|
|
* `const cancel = DOMTools.on(element, "click", () => {console.log("fired!"); cancel();});`
|
|
*
|
|
* @param {Element} element - Element to add listener to
|
|
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
|
|
* @param {(string|callable)} delegate - Selector to run on element to listen to
|
|
* @param {callable} [callback] - Function to fire on event
|
|
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
|
|
*/
|
|
|
|
|
|
static on(element, event, delegate, callback) {
|
|
const [type, namespace] = event.split(".");
|
|
const hasDelegate = delegate && callback;
|
|
if (!callback) callback = delegate;
|
|
const eventFunc = !hasDelegate ? callback : function (event) {
|
|
if (event.target.matches(delegate)) {
|
|
callback(event);
|
|
}
|
|
};
|
|
element.addEventListener(type, eventFunc);
|
|
|
|
const cancel = () => {
|
|
element.removeEventListener(type, eventFunc);
|
|
};
|
|
|
|
if (namespace) {
|
|
if (!this.listeners[namespace]) this.listeners[namespace] = [];
|
|
|
|
const newCancel = () => {
|
|
cancel();
|
|
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
|
|
};
|
|
|
|
this.listeners[namespace].push({
|
|
event: type,
|
|
element: element,
|
|
cancel: newCancel
|
|
});
|
|
return newCancel;
|
|
}
|
|
|
|
return cancel;
|
|
}
|
|
/**
|
|
* Functionality for this method matches {@link module:DOMTools.on} but automatically cancels itself
|
|
* and removes the listener upon the first firing of the desired event.
|
|
*
|
|
* @param {Element} element - Element to add listener to
|
|
* @param {string} event - Event to listen to with option namespace (e.g. "event.namespace")
|
|
* @param {(string|callable)} delegate - Selector to run on element to listen to
|
|
* @param {callable} [callback] - Function to fire on event
|
|
* @returns {module:DOMTools~CancelListener} - A function that will undo the listener
|
|
*/
|
|
|
|
|
|
static once(element, event, delegate, callback) {
|
|
const [type, namespace] = event.split(".");
|
|
const hasDelegate = delegate && callback;
|
|
if (!callback) callback = delegate;
|
|
const eventFunc = !hasDelegate ? function (event) {
|
|
callback(event);
|
|
element.removeEventListener(type, eventFunc);
|
|
} : function (event) {
|
|
if (!event.target.matches(delegate)) return;
|
|
callback(event);
|
|
element.removeEventListener(type, eventFunc);
|
|
};
|
|
element.addEventListener(type, eventFunc);
|
|
|
|
const cancel = () => {
|
|
element.removeEventListener(type, eventFunc);
|
|
};
|
|
|
|
if (namespace) {
|
|
if (!this.listeners[namespace]) this.listeners[namespace] = [];
|
|
|
|
const newCancel = () => {
|
|
cancel();
|
|
this.listeners[namespace].splice(this.listeners[namespace].findIndex(l => l.event == type && l.element == element), 1);
|
|
};
|
|
|
|
this.listeners[namespace].push({
|
|
event: type,
|
|
element: element,
|
|
cancel: newCancel
|
|
});
|
|
return newCancel;
|
|
}
|
|
|
|
return cancel;
|
|
}
|
|
|
|
static __offAll(event, element) {
|
|
const [type, namespace] = event.split(".");
|
|
|
|
let matchFilter = listener => listener.event == type,
|
|
defaultFilter = _ => _;
|
|
|
|
if (element) matchFilter = l => l.event == type && l.element == element, defaultFilter = l => l.element == element;
|
|
const listeners = this.listeners[namespace] || [];
|
|
const list = type ? listeners.filter(matchFilter) : listeners.filter(defaultFilter);
|
|
|
|
for (let c = 0; c < list.length; c++) list[c].cancel();
|
|
}
|
|
/**
|
|
* This is similar to jQuery's `off` function and can *hopefully* be used in the same way.
|
|
*
|
|
* Rather than attempt to explain, I'll show some example usages.
|
|
*
|
|
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element`.
|
|
* `DOMTools.off(element, "click.myPlugin", onClick);`
|
|
*
|
|
* The following will remove a click listener called `onClick` (in the `myPlugin` namespace) from `element` that only fired when the target is a `.block` element.
|
|
* `DOMTools.off(element, "click.myPlugin", ".block", onClick);`
|
|
*
|
|
* The following will remove a click listener (without namespace) from `element`.
|
|
* `DOMTools.off(element, "click", onClick);`
|
|
*
|
|
* The following will remove all listeners in namespace `myPlugin` from `element`.
|
|
* `DOMTools.off(element, ".myPlugin");`
|
|
*
|
|
* The following will remove all click listeners in namespace `myPlugin` from *all elements*.
|
|
* `DOMTools.off("click.myPlugin");`
|
|
*
|
|
* The following will remove all listeners in namespace `myPlugin` from *all elements*.
|
|
* `DOMTools.off(".myPlugin");`
|
|
*
|
|
* @param {(Element|string)} element - Element to remove listener from
|
|
* @param {string} [event] - Event to listen to with option namespace (e.g. "event.namespace")
|
|
* @param {(string|callable)} [delegate] - Selector to run on element to listen to
|
|
* @param {callable} [callback] - Function to fire on event
|
|
* @returns {Element} - The original element to allow for chaining
|
|
*/
|
|
|
|
|
|
static off(element, event, delegate, callback) {
|
|
if (typeof element == "string") return this.__offAll(element);
|
|
const [type, namespace] = event.split(".");
|
|
if (namespace) return this.__offAll(event, element);
|
|
const hasDelegate = delegate && callback;
|
|
if (!callback) callback = delegate;
|
|
const eventFunc = !hasDelegate ? callback : function (event) {
|
|
if (event.target.matches(delegate)) {
|
|
callback(event);
|
|
}
|
|
};
|
|
element.removeEventListener(type, eventFunc);
|
|
return element;
|
|
}
|
|
/**
|
|
* Adds a listener for when the node is added/removed from the document body.
|
|
* The listener is automatically removed upon firing.
|
|
* @param {HTMLElement} node - node to wait for
|
|
* @param {callable} callback - function to be performed on event
|
|
* @param {boolean} onMount - determines if it should fire on Mount or on Unmount
|
|
*/
|
|
|
|
|
|
static onMountChange(node, callback, onMount = true) {
|
|
const wrappedCallback = () => {
|
|
this.observer.unsubscribe(wrappedCallback);
|
|
callback();
|
|
};
|
|
|
|
this.observer.subscribe(wrappedCallback, mutation => {
|
|
const nodes = Array.from(onMount ? mutation.addedNodes : mutation.removedNodes);
|
|
const directMatch = nodes.indexOf(node) > -1;
|
|
const parentMatch = nodes.some(parent => parent.contains(node));
|
|
return directMatch || parentMatch;
|
|
});
|
|
return node;
|
|
}
|
|
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `true` */
|
|
|
|
|
|
static onMount(node, callback) {
|
|
return this.onMountChange(node, callback);
|
|
}
|
|
/** Shorthand for {@link module:DOMTools.onMountChange} with third parameter `false` */
|
|
|
|
|
|
static onUnmount(node, callback) {
|
|
return this.onMountChange(node, callback, false);
|
|
}
|
|
/** Alias for {@link module:DOMTools.onMount} */
|
|
|
|
|
|
static onAdded(node, callback) {
|
|
return this.onMount(node, callback);
|
|
}
|
|
/** Alias for {@link module:DOMTools.onUnmount} */
|
|
|
|
|
|
static onRemoved(node, callback) {
|
|
return this.onUnmount(node, callback, false);
|
|
}
|
|
/**
|
|
* Helper function which combines multiple elements into one parent element
|
|
* @param {Array<HTMLElement>} elements - array of elements to put into a single parent
|
|
*/
|
|
|
|
|
|
static wrap(elements) {
|
|
const domWrapper = this.parseHTML(`<div class="dom-wrapper"></div>`);
|
|
|
|
for (let e = 0; e < elements.length; e++) domWrapper.appendChild(elements[e]);
|
|
|
|
return domWrapper;
|
|
}
|
|
/**
|
|
* Resolves the node to an HTMLElement. This is mainly used by library modules.
|
|
* @param {(jQuery|Element)} node - node to resolve
|
|
*/
|
|
|
|
|
|
static resolveElement(node) {
|
|
if (!(node instanceof jQuery) && !(node instanceof Element)) return undefined;
|
|
return node instanceof jQuery ? node[0] : node;
|
|
}
|
|
|
|
}
|
|
window.Lightcord.BetterDiscord.DOM = DOMTools;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/emojiModule.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/emojiModule.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
const Constants = {
|
|
EmojiRegex: /<a?\.(\w+)\.(\d+)>/g
|
|
};
|
|
let CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
|
|
let EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
|
|
let AutocompleteModule = BDModules.get(e => e.default && e.default.displayName === "Autocomplete")[0];
|
|
let AutoCompletionTemplates = BDModules.get(e => e.getAutocompleteOptions)[0];
|
|
let EmojiModuleQuery = BDModules.get(e => e.default && e.default.queryEmojiResults)[0];
|
|
let Messages = BDModules.get(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING)[0];
|
|
let guildModule = BDModules.get(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching)[0];
|
|
let emojiSearch = BDModules.get(e => e.default && e.default.getDisambiguatedEmojiContext);
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class EmojiModule {
|
|
constructor() {
|
|
this.init().catch(err => _utils__WEBPACK_IMPORTED_MODULE_1__["default"].err("EmojiModule", "An error occured", err)); // better logging
|
|
}
|
|
|
|
async init() {
|
|
/** Emoji AutoComplete */
|
|
if (!AutocompleteModule) AutocompleteModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "Autocomplete");
|
|
if (!AutoCompletionTemplates) AutoCompletionTemplates = await window.Lightcord.Api.ensureExported(e => e.getAutocompleteOptions);
|
|
if (!EmojiModuleQuery) EmojiModuleQuery = await window.Lightcord.Api.ensureExported(e => e.default && e.default.queryEmojiResults);
|
|
if (!Messages) Messages = await window.Lightcord.Api.ensureExported(e => e.default && e.default.Messages && e.default.Messages.EMOJI_MATCHING);
|
|
if (!guildModule) guildModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getGuild && e.default.getGuilds && !e.default.isFetching);
|
|
if (!emojiSearch) emojiSearch = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getDisambiguatedEmojiContext);
|
|
|
|
if (AutocompleteModule && AutoCompletionTemplates && EmojiModuleQuery && Messages && guildModule && emojiSearch) {
|
|
console.log(`Patching getAutocompleteOptions of AutoCompletionTemplates`, AutoCompletionTemplates);
|
|
const getAutocompleteOptions = AutoCompletionTemplates.getAutocompleteOptions;
|
|
|
|
AutoCompletionTemplates.getAutocompleteOptions = function (e, t, n, r, a) {
|
|
const value = getAutocompleteOptions.call(this, ...arguments);
|
|
value.LIGHTCORD_EMOJIS = {
|
|
matches(arg1, arg2) {
|
|
let condition = arg2.length > 1 && "." === arg1;
|
|
setEmojiUsable(condition);
|
|
return condition;
|
|
},
|
|
|
|
queryResults(t) {
|
|
let results = EmojiModuleQuery.default.queryEmojiResults(t, e);
|
|
return results;
|
|
},
|
|
|
|
renderResults(e, t, n, r, a) {
|
|
return D(e, t, a.emojis, n, r, Messages.default.Messages.EMOJI_MATCHING, Messages.default.Messages.EMOJI, AutocompleteModule.default.Emoji, function (e) {
|
|
return {
|
|
emoji: e,
|
|
key: e.id || e.uniqueName || e.name,
|
|
sentinel: ".",
|
|
guild: null != e.guildId ? guildModule.default.getGuild(e.guildId) : null
|
|
};
|
|
}, function (e) {
|
|
return "." + e + ".";
|
|
});
|
|
},
|
|
|
|
getPlainText(id, guild) {
|
|
var emojis = guild.emojis;
|
|
if (null == emojis || null == emojis[id]) return "";
|
|
var emoji = emojis[id],
|
|
isAnimated = emoji.animated ? "a" : "";
|
|
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
|
|
},
|
|
|
|
getRawText(id, guild) {
|
|
var emojis = guild.emojis;
|
|
if (null == emojis || null == emojis[id]) return "";
|
|
var emoji = emojis[id],
|
|
isAnimated = emoji.animated ? "a" : "";
|
|
return emoji.managed || null == emoji.id ? "." + emoji.name + "." : "<" + isAnimated + "." + (emoji.originalName || emoji.name) + "." + emoji.id + ">";
|
|
}
|
|
|
|
};
|
|
return value;
|
|
};
|
|
} else {
|
|
console.error(new Error("Couldn't start autocompletion of Lightcord's emojis."));
|
|
}
|
|
/** Emoji display */
|
|
|
|
|
|
while (!_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent) await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
if (!this.cancelEmojiRender) {
|
|
// TODO: Proper emoji formatting / rendering
|
|
this.cancelEmoteRender = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].monkeyPatch(_v2__WEBPACK_IMPORTED_MODULE_0__["default"].MessageComponent, "default", {
|
|
before: data => {
|
|
const message = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.message");
|
|
if (!message) return;
|
|
const content = _utils__WEBPACK_IMPORTED_MODULE_1__["default"].getNestedProp(data.methodArguments[0], "childrenMessageContent.props.content");
|
|
if (!content || !content.length) return;
|
|
/**
|
|
* @type {{
|
|
* raw: string,
|
|
* name: string,
|
|
* id: string,
|
|
* animated: boolean
|
|
* }[]}
|
|
*/
|
|
|
|
let emojis = [];
|
|
const newContent = [];
|
|
|
|
for (let node of content) {
|
|
if (typeof node !== "string") {
|
|
newContent.push(node);
|
|
continue;
|
|
}
|
|
|
|
;
|
|
let parsed;
|
|
let hasParsed = false;
|
|
|
|
do {
|
|
parsed = Constants.EmojiRegex.exec(node);
|
|
|
|
if (parsed) {
|
|
hasParsed = true;
|
|
if (!EmojiModuleApi) EmojiModuleApi = BDModules.get(e => e.default && e.default.getCustomEmojiById)[0];
|
|
const emoji = EmojiModuleApi.default.getCustomEmojiById(parsed[2]);
|
|
|
|
if (emoji) {
|
|
emojis.push({
|
|
animated: emoji.animated,
|
|
name: emoji.name,
|
|
id: emoji.id,
|
|
raw: parsed[0]
|
|
});
|
|
} else {
|
|
emojis.push({
|
|
animated: parsed[0].startsWith("<a"),
|
|
name: parsed[1],
|
|
id: parsed[2],
|
|
raw: parsed[0]
|
|
});
|
|
}
|
|
}
|
|
} while (parsed);
|
|
|
|
if (hasParsed) {
|
|
const words = node.split(" ").map((word, index, arr) => {
|
|
if (!word) return "";
|
|
const emoji = emojis.find(e => e.raw == word);
|
|
if (!emoji) return word;
|
|
if (!CustomEmojiModule) CustomEmojiModule = BDModules.get(e => e.CustomEmoji)[0];
|
|
return React.createElement(CustomEmojiModule.CustomEmoji, {
|
|
emoji: {
|
|
name: `.${emoji.name}.`,
|
|
emojiId: emoji.id,
|
|
animated: emoji.animated,
|
|
jumboable: arr.length === 1 && content.length === 1
|
|
}
|
|
});
|
|
}).reduce((previous, current) => {
|
|
if (previous.length === 0) return [current];
|
|
|
|
if (typeof current === "string") {
|
|
if (typeof previous[previous.length - 1] === "string") {
|
|
previous[previous.length - 1] += ` ${current}`;
|
|
return previous;
|
|
}
|
|
|
|
previous.push(" " + current);
|
|
return previous;
|
|
}
|
|
|
|
previous.push(" ", current);
|
|
return previous;
|
|
}, []);
|
|
newContent.push(...words);
|
|
} else {
|
|
newContent.push(node);
|
|
}
|
|
}
|
|
|
|
while (data.methodArguments[0].childrenMessageContent.props.content[0]) {
|
|
data.methodArguments[0].childrenMessageContent.props.content.shift();
|
|
}
|
|
|
|
while (newContent[0]) {
|
|
data.methodArguments[0].childrenMessageContent.props.content.push(newContent.shift());
|
|
}
|
|
}
|
|
});
|
|
}
|
|
/*
|
|
let userModule
|
|
window.Lightcord.Api.ensureExported(e => e.default && e.default.displayName === "EmojiPickerListRow")
|
|
.then(EmojiPickerListRow => {
|
|
let classs = EmojiPickerListRow.default
|
|
EmojiPickerListRow.default = class EmojiPickerListRow extends React.Component {
|
|
constructor(props){
|
|
super(props)
|
|
}
|
|
render(){
|
|
if(!userModule)userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0]
|
|
if(!userModule)return React.createElement(classs, this.props)
|
|
let user = userModule.default.getCurrentUser()
|
|
if(!user.hasPremiumSubscription)return React.createElement(classs, this.props)
|
|
return React.createElement(classs, Object.assign({}, this.props, {
|
|
emojiDescriptors: this.props.emojiDescriptors.map(e => {
|
|
e.isDisabled = false
|
|
})
|
|
}))
|
|
}
|
|
}
|
|
EmojiPickerListRow.default.displayName = "EmojiPickerListRow"
|
|
})*/
|
|
|
|
}
|
|
|
|
disable() {
|
|
if (!this.cancelEmoteRender) return;
|
|
this.cancelEmoteRender();
|
|
this.cancelEmoteRender = null;
|
|
}
|
|
|
|
start() {}
|
|
|
|
}());
|
|
|
|
function D(e, t, n, r, o, i, s, u, l, c) {
|
|
if (null == n || 0 === n.length) return null;
|
|
var d = n.map(function (e, n) {
|
|
return React.createElement(u, Object.assign({
|
|
onClick: o,
|
|
onHover: r,
|
|
selected: t === n,
|
|
index: n
|
|
}, l(e, n)));
|
|
});
|
|
return [R(i, s, e, c), d];
|
|
}
|
|
|
|
function R(e, t, n, r) {
|
|
var a = n.length > 0 ? e.format({
|
|
prefix: r(n)
|
|
}) : t;
|
|
|
|
if (Array.isArray(a)) {
|
|
a.unshift(React.createElement("strong", {}, "[Lightcord] "));
|
|
} else {
|
|
a = "[LIGHTCORD] " + a;
|
|
}
|
|
|
|
return React.createElement(AutocompleteModule.default.Title, {
|
|
title: a
|
|
}, a);
|
|
}
|
|
|
|
R.displayName = "renderHeader";
|
|
let EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
|
|
let isEmojiDisabled = EmojiFilterModule && EmojiFilterModule.default.isEmojiDisabled;
|
|
let isUsable = false;
|
|
let hasPatched = false;
|
|
|
|
function setEmojiUsable(usable) {
|
|
isUsable = usable;
|
|
if (hasPatched) return;
|
|
if (!EmojiFilterModule) EmojiFilterModule = BDModules.get(e => e.default && e.default.isEmojiDisabled)[0];
|
|
if (!EmojiFilterModule) return;
|
|
if (!isEmojiDisabled) isEmojiDisabled = EmojiFilterModule.default.isEmojiDisabled;
|
|
hasPatched = true;
|
|
|
|
EmojiFilterModule.default.isEmojiDisabled = function (emoji) {
|
|
if (isUsable) {
|
|
if (emoji.surrogates || emoji.diversity) return true;
|
|
return false;
|
|
}
|
|
|
|
return isEmojiDisabled.call(this, ...arguments);
|
|
};
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/pluginCertifier.js":
|
|
/*!****************************************!*\
|
|
!*** ./src/modules/pluginCertifier.js ***!
|
|
\****************************************/
|
|
/*! exports provided: default, checkViruses, checkHash, processFile, processAttachment, decryptSettingsCache, encryptSettingsCache */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkViruses", function() { return checkViruses; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "checkHash", function() { return checkHash; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processFile", function() { return processFile; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "processAttachment", function() { return processAttachment; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "decryptSettingsCache", function() { return decryptSettingsCache; });
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "encryptSettingsCache", function() { return encryptSettingsCache; });
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ "node-fetch");
|
|
/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__);
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ "crypto");
|
|
/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__);
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! path */ "path");
|
|
/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_7__);
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const cache = {};
|
|
const cache2 = {};
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class PluginCertifier {
|
|
constructor() {
|
|
window.Lightcord.BetterDiscord.PluginCertifier = this;
|
|
}
|
|
|
|
patch(attachment, id) {
|
|
process.nextTick(() => {
|
|
processAttachment(attachment, id);
|
|
});
|
|
}
|
|
|
|
start() {}
|
|
|
|
isTrusted(hash) {
|
|
return cache[hash] && !cache[hash].suspect;
|
|
}
|
|
|
|
}());
|
|
function checkViruses(hash, data, resultCallback, removeCallback, filename) {
|
|
data = data.toString("utf8");
|
|
let isHarmful = false;
|
|
|
|
for (let keyword of data.split(/[^\w\d]+/g)) {
|
|
for (let oof of ["token", "email", "phone", "MFA", "2fa", "child_process", "localStorage", "eval", "getGlobal", "BrowserWindow"]) {
|
|
if (keyword.toLowerCase().includes(oof.toLowerCase()) && !keyword.toLowerCase() === "domtokenlist") {
|
|
console.log(oof, keyword);
|
|
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;
|
|
if (regex.test(no_comments)) isHarmful = "obfuscation/hidden code";
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!isHarmful) return removeCallback(hash);
|
|
cache[hash] = {
|
|
suspect: true,
|
|
name: hashToUrl[hash].split("/").pop(),
|
|
type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme",
|
|
harm: isHarmful,
|
|
hash: hash,
|
|
filename
|
|
};
|
|
console.log(`Found potentially dangerous ${cache[hash].type.toLowerCase()}: ${cache[hash].name}`);
|
|
resultCallback(cache[hash]);
|
|
}
|
|
const hashToUrl = {};
|
|
function checkHash(hash, data, filename, resultCallback, removeCallback) {
|
|
console.log(`File: ${filename} hash: ${hash}`);
|
|
|
|
if (!cache[hash]) {
|
|
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()("https://cdn.jsdelivr.net/gh/Lightcord/filehashes@master/hashes/" + hash, {
|
|
// Using node-fetch to bypass cors
|
|
headers: {
|
|
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent // have to set user-agent
|
|
|
|
}
|
|
}).then(async res => {
|
|
if (res.status !== 200) {
|
|
if (filename.endsWith(".theme.css")) return removeCallback(hash);
|
|
checkViruses(hash, data, resultCallback, removeCallback, filename);
|
|
return;
|
|
}
|
|
|
|
const result = await res.json();
|
|
result.hash = hash;
|
|
result.filename = filename;
|
|
cache[hash] = result;
|
|
resultCallback(result);
|
|
}).catch(err => {
|
|
console.error(`Could not read from github. ${err}`);
|
|
if (filename.endsWith(".theme.css")) return removeCallback(hash);
|
|
checkViruses(hash, data, resultCallback, removeCallback, filename);
|
|
});
|
|
} else {
|
|
const result = cache[hash];
|
|
resultCallback(result);
|
|
}
|
|
}
|
|
function processFile(__path, resultCallback, removeCallback = hash => {}, isFromLoader = false) {
|
|
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
|
|
let data = Buffer.alloc(0);
|
|
Object(fs__WEBPACK_IMPORTED_MODULE_6__["createReadStream"])(__path).on("data", chunk => {
|
|
data = Buffer.concat([data, chunk]);
|
|
hash.update(chunk);
|
|
}).on("end", () => {
|
|
const hashResult = hash.digest("hex");
|
|
hashToUrl[hashResult] = __path;
|
|
|
|
if (isFromLoader && _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult]) {
|
|
let value = _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult];
|
|
|
|
if (value.timestamp < Date.now() - 6.048e+8) {
|
|
delete _contentManager__WEBPACK_IMPORTED_MODULE_8__["addonCache"][hashResult];
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_8__["default"].saveAddonCache();
|
|
} else {
|
|
resultCallback(value.result);
|
|
return;
|
|
}
|
|
}
|
|
|
|
checkHash(hashResult, data, Object(path__WEBPACK_IMPORTED_MODULE_7__["basename"])(__path), resultCallback, removeCallback);
|
|
});
|
|
}
|
|
function processAttachment(attachment, id) {
|
|
if (!document.getElementById(id)) return;
|
|
if (!attachment.url.startsWith("https://cdn.discordapp.com/")) return document.getElementById(id).remove();
|
|
if (!attachment.filename.endsWith(".plugin.js") && !attachment.filename.endsWith(".theme.css")) return document.getElementById(id).remove();
|
|
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, {
|
|
headers: {
|
|
"User-Agent": electron__WEBPACK_IMPORTED_MODULE_1__["remote"].getCurrentWebContents().userAgent
|
|
}
|
|
}).then(res => {
|
|
if (res.status !== 200) throw new Error("File doesn't exist.");
|
|
const hash = crypto__WEBPACK_IMPORTED_MODULE_2__["createHash"]("sha256");
|
|
let data = Buffer.alloc(0);
|
|
res.body.on("data", chunk => {
|
|
data = Buffer.concat([data, chunk]);
|
|
hash.update(chunk);
|
|
});
|
|
res.body.on("end", () => {
|
|
const hashResult = hash.digest("hex");
|
|
cache2[attachment.url] = hashResult;
|
|
hashToUrl[hashResult] = attachment.url;
|
|
checkHash(hashResult, data, attachment.filename, result => {
|
|
renderToElements(id, result, attachment.filename);
|
|
}, () => {
|
|
let elem = document.getElementById(id);
|
|
if (elem) elem.remove();
|
|
});
|
|
});
|
|
}).catch(() => {});
|
|
}
|
|
let flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
|
|
let childModule = BDModules.get(e => e.childContainer)[0];
|
|
/**
|
|
*
|
|
* @param {HTMLDivElement[]} elements
|
|
* @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string, harm: string}} result
|
|
*/
|
|
|
|
function renderToElements(id, result, filename) {
|
|
const div = document.getElementById(id);
|
|
if (!div || div.childNodes.length > 0) return; // already certified/div does not exist anymore.
|
|
|
|
if (!flowerStarModule) flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];
|
|
if (!childModule) childModule = BDModules.get(e => e.childContainer)[0];
|
|
|
|
if (result.suspect) {
|
|
try {
|
|
div.parentNode.style.borderColor = "rgb(240, 71, 71)";
|
|
/**
|
|
*
|
|
* @param {HTMLElement} node
|
|
*/
|
|
|
|
let nextNode = node => {
|
|
for (let child of node.children) {
|
|
if (child.tagName === "A") {
|
|
child.addEventListener("click", e => {
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this ?", "The " + result.type.toLowerCase() + " **" + filename + "** might be dangerous **(" + result.harm + ")**. \n\n**We don't recommand to download it**. However, you can still do it below.", {
|
|
confirmText: "Download Anyway",
|
|
cancelText: "Don't !",
|
|
danger: true,
|
|
onCancel: () => {},
|
|
onConfirm: () => {
|
|
electron__WEBPACK_IMPORTED_MODULE_1__["remote"].shell.openExternal(child.href);
|
|
}
|
|
});
|
|
});
|
|
} else if (["div"].includes(child.tagName.toLowerCase())) {
|
|
nextNode(child);
|
|
}
|
|
}
|
|
};
|
|
|
|
nextNode(div.parentNode);
|
|
} catch (e) {
|
|
console.error(e);
|
|
}
|
|
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: result.type + " " + result.name + " is potentially dangerous."
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "20px",
|
|
height: "20px"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: BDModules.get(e => e.svg)[0].svg,
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 40 32"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("rect", {
|
|
x: "0",
|
|
y: "0",
|
|
width: "32",
|
|
height: "32",
|
|
mask: "url(#svg-mask-avatar-status-round-32)",
|
|
fill: "#f04747",
|
|
mask: "url(#svg-mask-status-dnd)",
|
|
className: BDModules.get(e => e.pointerEvents)[0].pointerEvents
|
|
})))), div);
|
|
} else if (!result.official) {
|
|
div.parentNode.style.borderColor = "#4087ed";
|
|
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
|
|
style: {
|
|
display: "inherit"
|
|
}
|
|
}, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: result.type + " " + result.name + " is certified by Lightcord."
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "20px",
|
|
height: "20px",
|
|
float: "left"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: flowerStarModule.flowerStar,
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 16 15.2"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "#4f545c",
|
|
"fill-rule": "evenodd",
|
|
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
|
|
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: childModule.childContainer
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 16 15.2"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "#ffffff",
|
|
d: "M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z"
|
|
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "20px",
|
|
height: "20px"
|
|
},
|
|
|
|
onClick() {
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically install and launch this " + result.type.toLowerCase() + ". You don't have anything to do.", {
|
|
confirmText: "Download and Install",
|
|
cancelText: "I've changed my mind",
|
|
danger: false,
|
|
onCancel: () => {},
|
|
onConfirm: () => {
|
|
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
|
|
console.log(link);
|
|
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
|
|
if (res.status !== 200) throw new Error("Status was not 200");
|
|
let content = await res.buffer();
|
|
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
|
|
console.log(installPath);
|
|
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
|
|
}).catch(err => {
|
|
err = err instanceof Error ? err : new Error(err);
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
|
|
type: "error"
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: flowerStarModule.flowerStar,
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
color: "rgb(67, 181, 129)",
|
|
cursor: "pointer"
|
|
}
|
|
}, /*#__PURE__*/React.createElement("g", {
|
|
fill: "none",
|
|
"fill-rule": "evenodd"
|
|
}, /*#__PURE__*/React.createElement("path", {
|
|
d: "M0 0h24v24H0z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
class: "fill",
|
|
fill: "currentColor",
|
|
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
|
|
})))))]);
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
|
|
} else {
|
|
div.parentNode.style.borderColor = "#4087ed";
|
|
let span = _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("span", {
|
|
style: {
|
|
display: "inherit"
|
|
}
|
|
}, [_v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: result.type + " " + result.name + " was made by the developers of Lightcord.",
|
|
style: "brand"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "20px",
|
|
height: "20px",
|
|
float: "left"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: flowerStarModule.flowerStar,
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 16 15.2",
|
|
stroke: "#36393f",
|
|
style: {
|
|
color: "#4087ed"
|
|
}
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "currentColor",
|
|
"fill-rule": "evenodd",
|
|
d: "m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z"
|
|
})), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: childModule.childContainer
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 16 15.2"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("path", {
|
|
fill: "#ffffff",
|
|
d: "M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z"
|
|
}))))), _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: "Install this " + result.type.toLowerCase() + " on Lightcord."
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("div", {
|
|
className: flowerStarModule.flowerStarContainer,
|
|
style: {
|
|
width: "20px",
|
|
height: "20px"
|
|
},
|
|
|
|
onClick() {
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showConfirmationModal("Are you sure you want to download this " + result.type.toLowerCase() + " ?", "Lightcord will automatically download and load this " + result.type.toLowerCase() + ". You must enable it in the settings.", {
|
|
confirmText: "Download and Install",
|
|
cancelText: "I've changed my mind",
|
|
danger: false,
|
|
onCancel: () => {},
|
|
onConfirm: () => {
|
|
let link = getKeyedArray(cache2).find(e => e[1] === result.hash)[0];
|
|
node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(link).then(async res => {
|
|
if (res.status !== 200) throw new Error("Status was not 200");
|
|
let content = await res.buffer();
|
|
let installPath = Object(path__WEBPACK_IMPORTED_MODULE_7__["join"])(result.type === "Plugin" ? _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._pluginsFolder : _contentManager__WEBPACK_IMPORTED_MODULE_8__["default"]._themesFolder, result.filename);
|
|
Object(fs__WEBPACK_IMPORTED_MODULE_6__["writeFileSync"])(installPath, content);
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(result.type + " succesfully installed.");
|
|
}).catch(err => {
|
|
err = err instanceof Error ? err : new Error(err);
|
|
_utils__WEBPACK_IMPORTED_MODULE_5__["default"].showToast(err.message, {
|
|
type: "error"
|
|
});
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_3__["default"].react.createElement("svg", {
|
|
className: flowerStarModule.flowerStar,
|
|
"aria-hidden": "false",
|
|
width: "20px",
|
|
height: "20px",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
color: "rgb(67, 181, 129)",
|
|
cursor: "pointer"
|
|
}
|
|
}, /*#__PURE__*/React.createElement("g", {
|
|
fill: "none",
|
|
"fill-rule": "evenodd"
|
|
}, /*#__PURE__*/React.createElement("path", {
|
|
d: "M0 0h24v24H0z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
class: "fill",
|
|
fill: "currentColor",
|
|
d: "M19 9h-4V3H9v6H5l7 7 7-7zM5 18v2h14v-2H5z"
|
|
})))))]);
|
|
_v2__WEBPACK_IMPORTED_MODULE_3__["default"].reactDom.render(span, div);
|
|
}
|
|
}
|
|
|
|
function getKeyedArray(obj) {
|
|
let arr = [];
|
|
Object.keys(obj).forEach(k => {
|
|
arr.push([k, obj[k]]);
|
|
});
|
|
return arr;
|
|
}
|
|
|
|
let key = null;
|
|
let save = null;
|
|
window.Lightcord.Api.ensureExported(m => m.ObjectStorage).then(localStorageModule => {
|
|
let localStorage = localStorageModule.impl;
|
|
|
|
save = function () {
|
|
localStorage.set("PluginCertifierKeyEncryption__", btoa(JSON.stringify(key)));
|
|
};
|
|
|
|
setInterval(() => {
|
|
save();
|
|
}, 100000);
|
|
|
|
try {
|
|
let val = safeJSONParse(atob(localStorage.get("PluginCertifierKeyEncryption__")));
|
|
|
|
if (val instanceof Error || !Array.isArray(val) || val.length !== 2 || val.find(e => typeof e !== "string") || Buffer.from(val[0], "base64").length !== 16 || Buffer.from(val[1], "base64").length !== 32) {
|
|
generateKey();
|
|
save();
|
|
return;
|
|
}
|
|
|
|
key = val;
|
|
} catch (e) {
|
|
generateKey();
|
|
save();
|
|
}
|
|
});
|
|
|
|
function generateKey() {
|
|
key = [crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](16).toString("base64"), crypto__WEBPACK_IMPORTED_MODULE_2__["randomBytes"](32).toString("base64")];
|
|
}
|
|
|
|
function safeJSONParse(json) {
|
|
try {
|
|
return JSON.parse(json);
|
|
} catch (e) {
|
|
return e instanceof Error ? new Error(e) : e;
|
|
}
|
|
}
|
|
|
|
function decryptSettingsCache(data) {
|
|
try {
|
|
let decipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createDecipheriv"]("aes-256-cbc", Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64"));
|
|
let decrypted = decipher.update(Buffer.from(data, "base64"));
|
|
decrypted = Buffer.concat([decrypted, decipher.final()]);
|
|
return decrypted.toString("utf8");
|
|
} catch (e) {
|
|
return "{}";
|
|
}
|
|
}
|
|
function encryptSettingsCache(data) {
|
|
let args = [Buffer.from(key[1], "base64"), Buffer.from(key[0], "base64")];
|
|
let cipher = crypto__WEBPACK_IMPORTED_MODULE_2__["createCipheriv"]('aes-256-cbc', ...args);
|
|
let encrypted = cipher.update(Buffer.from(data, "utf8"));
|
|
encrypted = Buffer.concat([encrypted, cipher.final()]);
|
|
return encrypted.toString("base64");
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/pluginModule.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/modules/pluginModule.js ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PluginModule {
|
|
constructor() {
|
|
window.Lightcord.BetterDiscord.PluginModule = this;
|
|
}
|
|
|
|
get folder() {
|
|
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder;
|
|
}
|
|
|
|
}
|
|
|
|
PluginModule.prototype.loadPlugins = async function () {
|
|
this.loadPluginData();
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadPlugins()));
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
let plugin, name;
|
|
|
|
try {
|
|
plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
name = plugin.getName();
|
|
if (plugin.load && typeof plugin.load == "function") plugin.load();
|
|
} catch (err) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be loaded.", err);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
|
|
name: name,
|
|
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
|
|
message: "load() could not be fired.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
});
|
|
continue;
|
|
}
|
|
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name]) {
|
|
try {
|
|
plugin.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} has started.`);
|
|
} catch (err) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][name] = false;
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", name + " could not be started.", err);
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdpluginErrors"].push({
|
|
name: name,
|
|
file: _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].filename,
|
|
message: "start() could not be fired.",
|
|
error: {
|
|
message: err.message,
|
|
stack: err.stack
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
}
|
|
|
|
this.savePluginData();
|
|
|
|
__webpack_require__(/*! electron */ "electron").remote.getCurrentWebContents().on("did-navigate-in-page", this.channelSwitch.bind(this)); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("plugin");
|
|
|
|
};
|
|
|
|
PluginModule.prototype.startPlugin = function (plugin, reload = false) {
|
|
try {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has started.`);
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be started.`, {
|
|
type: "error"
|
|
});
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
|
|
this.savePluginData();
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", plugin + " could not be started.", err);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.stopPlugin = function (plugin, reload = false) {
|
|
try {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.stop();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} has stopped.`);
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"] && !reload) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName()} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} could not be stopped.`, {
|
|
type: "error"
|
|
});
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getName() + " could not be stopped.", err);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.enablePlugin = function (plugin, reload = false) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = true;
|
|
this.savePluginData();
|
|
this.startPlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.enable = function (plugin, reload = false) {
|
|
return this.enablePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.disablePlugin = function (plugin, reload = false) {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) return;
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin] = false;
|
|
this.savePluginData();
|
|
this.stopPlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.disable = function (plugin, reload = false) {
|
|
return this.disablePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.togglePlugin = function (plugin) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin);else this.enablePlugin(plugin);
|
|
};
|
|
|
|
PluginModule.prototype.toggle = function (plugin, reload = false) {
|
|
return this.togglePlugin(plugin, reload);
|
|
};
|
|
|
|
PluginModule.prototype.loadPlugin = async function (filename) {
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadContent(filename, "plugin");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${filename} could not be loaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${filename} could not be loaded.`, error);
|
|
}
|
|
|
|
const plugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => console.log(p.filename, filename) || p.filename == filename).plugin;
|
|
|
|
try {
|
|
if (plugin.load && typeof plugin.load == "function") plugin.load();
|
|
} catch (err) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [err]
|
|
});
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin.getName()} v${plugin.getVersion()} was loaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin.getName()} v${plugin.getVersion()} was loaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-loaded", plugin.getName());
|
|
};
|
|
|
|
PluginModule.prototype.unloadPlugin = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
const plugin = bdplugin.plugin.getName();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin]) this.disablePlugin(plugin, true);
|
|
const error = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].unloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
|
|
delete _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin];
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be unloaded. It may have not been loaded yet.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be unloaded. It may have not been loaded yet.`, error);
|
|
}
|
|
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} was unloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} was unloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-unloaded", plugin);
|
|
};
|
|
|
|
PluginModule.prototype.delete = function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
this.unloadPlugin(bdplugin.filename);
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
|
|
|
|
__webpack_require__(/*! fs */ "fs").unlinkSync(fullPath);
|
|
};
|
|
|
|
PluginModule.prototype.reloadPlugin = async function (filenameOrName) {
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return this.loadPlugin(filenameOrName);
|
|
const plugin = bdplugin.plugin.getName();
|
|
const enabled = _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin];
|
|
if (enabled) this.stopPlugin(plugin, true);
|
|
const error = await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].reloadContent(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].filename, "plugin");
|
|
|
|
if (error) {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-1"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showContentErrors({
|
|
plugins: [error]
|
|
});
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} could not be reloaded.`, {
|
|
type: "error"
|
|
});
|
|
return _utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("ContentManager", `${plugin} could not be reloaded.`, error);
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load && typeof _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load == "function") _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.load();
|
|
if (enabled) this.startPlugin(plugin, true);
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].log("ContentManager", `${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-2"]) _utils__WEBPACK_IMPORTED_MODULE_4__["default"].showToast(`${plugin} v${_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugin].plugin.getVersion()} was reloaded.`, {
|
|
type: "success"
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("plugin-reloaded", plugin);
|
|
};
|
|
|
|
PluginModule.prototype.reload = function (name) {
|
|
return this.reloadPlugin(name);
|
|
};
|
|
|
|
PluginModule.prototype.edit = function (filenameOrName) {
|
|
console.log("Edit " + filenameOrName);
|
|
const bdplugin = Object.values(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]).find(p => p.filename == filenameOrName) || _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][filenameOrName];
|
|
if (!bdplugin) return;
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].pluginsFolder, bdplugin.filename);
|
|
|
|
console.log("Edit " + fullPath);
|
|
|
|
__webpack_require__(/*! electron */ "electron").shell.openItem(`${fullPath}`);
|
|
};
|
|
|
|
PluginModule.prototype.updatePluginList = function () {
|
|
const results = _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadNewContent("plugin");
|
|
|
|
for (const filename of results.added) this.loadPlugin(filename);
|
|
|
|
for (const name of results.removed) this.unloadPlugin(name);
|
|
};
|
|
|
|
PluginModule.prototype.loadPluginData = function () {
|
|
const saved = _dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].getSettingGroup("plugins");
|
|
|
|
if (saved) {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"], saved);
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.savePluginData = function () {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_2__["default"].setSettingGroup("plugins", _0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"]);
|
|
};
|
|
|
|
PluginModule.prototype.newMessage = function () {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.onMessage === "function") {
|
|
try {
|
|
plugin.onMessage();
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onMessage for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.channelSwitch = function () {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.onSwitch === "function") {
|
|
try {
|
|
plugin.onSwitch();
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire onSwitch for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
PluginModule.prototype.rawObserver = function (e) {
|
|
const plugins = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"]);
|
|
|
|
for (let i = 0; i < plugins.length; i++) {
|
|
const plugin = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdplugins"][plugins[i]].plugin;
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["pluginCookie"][plugin.getName()]) continue;
|
|
|
|
if (typeof plugin.observer === "function") {
|
|
try {
|
|
plugin.observer(e);
|
|
} catch (err) {
|
|
_utils__WEBPACK_IMPORTED_MODULE_4__["default"].err("Plugins", "Unable to fire observer for " + plugin.getName() + ".", err);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new PluginModule());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/popoutWindow.js":
|
|
/*!*************************************!*\
|
|
!*** ./src/modules/popoutWindow.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 _bdEvents__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class popoutWindow {
|
|
constructor() {
|
|
/**
|
|
* @type {Map<string, Window>}
|
|
*/
|
|
this.windows = new Map();
|
|
this.enabled = false;
|
|
this.init();
|
|
}
|
|
|
|
async init() {
|
|
let popoutModule = await window.Lightcord.Api.ensureExported(e => e.default && e.default.getWindow);
|
|
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_OPEN", ev => {
|
|
setImmediate(() => {
|
|
/**
|
|
* @type {Window}
|
|
*/
|
|
const window = popoutModule.default.getWindow(ev.key);
|
|
this.windows.set(ev.key, window);
|
|
let classList = window.document.body.classList;
|
|
classList.add("window-popout");
|
|
classList.add("lightcord");
|
|
classList.add("lightcord");
|
|
this.update(ev.key);
|
|
});
|
|
});
|
|
window.Lightcord.DiscordModules.dispatcher.subscribe("POPOUT_WINDOW_CLOSE", ev => {
|
|
setImmediate(() => {
|
|
this.windows.delete(ev.key);
|
|
});
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-enabled", () => {
|
|
this.update();
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-disabled", () => {
|
|
this.update();
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-reloaded", () => {
|
|
this.update();
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-unloaded", () => {
|
|
this.update();
|
|
});
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_1__["default"].on("theme-loaded", () => {
|
|
this.update();
|
|
});
|
|
}
|
|
|
|
enable() {
|
|
this.enabled = true;
|
|
this.update();
|
|
}
|
|
|
|
disable() {
|
|
this.enabled = false;
|
|
this.update();
|
|
}
|
|
|
|
update(key) {
|
|
if (!this.windows.size) return;
|
|
|
|
if (!this.enabled) {
|
|
return this.removeThemes(key);
|
|
} else {
|
|
return this.applyThemes(key);
|
|
}
|
|
}
|
|
|
|
removeThemes(key) {
|
|
if (this.enabled) return;
|
|
|
|
if (key) {
|
|
let window = this.windows.get(key);
|
|
if (!window) return;
|
|
let document = window.document;
|
|
|
|
for (let style of document.querySelectorAll("style[data-lightcord-theme=true]")) {
|
|
style.remove();
|
|
}
|
|
} else {
|
|
for (let key of this.windows.keys()) {
|
|
this.removeThemes(key);
|
|
}
|
|
}
|
|
}
|
|
|
|
applyThemes(key) {
|
|
if (!this.enabled) return;
|
|
|
|
if (key) {
|
|
let window = this.windows.get(key);
|
|
if (!window) return;
|
|
let document = window.document;
|
|
|
|
for (let style of document.querySelectorAll("style[data-lightcord-theme=true]")) {
|
|
style.setAttribute("will-remove", "true");
|
|
}
|
|
|
|
Object.keys(bdthemes).forEach(themeName => {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][themeName]) return; // theme disabled
|
|
|
|
const theme = bdthemes[themeName];
|
|
if (!theme) return; //:shrug:
|
|
|
|
let existing = document.querySelector("style[data-lightcord-theme=true]#" + _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].escapeID(theme.id));
|
|
|
|
if (existing) {
|
|
existing.innerHTML = unescape(theme.css);
|
|
existing.removeAttribute("will-remove");
|
|
} else {
|
|
const style = document.createElement("style");
|
|
style.id = _domtools__WEBPACK_IMPORTED_MODULE_2__["default"].escapeID(theme.id);
|
|
style.innerHTML = unescape(theme.css);
|
|
style.setAttribute("data-lightcord-theme", "true");
|
|
document.head.append(style);
|
|
}
|
|
});
|
|
|
|
for (let style of document.querySelectorAll("style[will-remove=true]")) {
|
|
style.remove();
|
|
}
|
|
} else {
|
|
for (let key of this.windows.keys()) {
|
|
this.applyThemes(key);
|
|
}
|
|
}
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/publicServers.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/publicServers.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../ui/publicservers/publicServers */ "./src/ui/publicservers/publicServers.js");
|
|
/* harmony import */ var _ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../ui/publicservers/layer */ "./src/ui/publicservers/layer.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class V2_PublicServers {
|
|
constructor() {
|
|
this._appendButton = this._appendButton.bind(this);
|
|
window.Lightcord.BetterDiscord.V2_PublicServers = this;
|
|
}
|
|
|
|
get component() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_layer__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
rootId: "pubslayerroot",
|
|
id: "pubslayer"
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_ui_publicservers_publicServers__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
rootId: "pubslayerroot"
|
|
}));
|
|
}
|
|
|
|
get root() {
|
|
const _root = document.getElementById("pubslayerroot");
|
|
|
|
if (!_root) {
|
|
if (!this.injectRoot()) return null;
|
|
return this.root;
|
|
}
|
|
|
|
return _root;
|
|
}
|
|
|
|
injectRoot() {
|
|
let [classNameLayers] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.layers && e.layer)[0].layers)];
|
|
const layers = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(".layers, ." + classNameLayers);
|
|
if (!layers) return false;
|
|
layers.append(_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement("<div id='pubslayerroot'>"));
|
|
return true;
|
|
}
|
|
|
|
render() {
|
|
const root = this.root;
|
|
|
|
if (!root) {
|
|
console.log("FAILED TO LOCATE ROOT: .layers");
|
|
return;
|
|
}
|
|
|
|
_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactDom.render(this.component, root);
|
|
}
|
|
|
|
get button() {
|
|
const btn = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-li" class="${_v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.listItem}">`);
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) btn.style.display = "none";
|
|
const label = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].createElement(`<div id="bd-pub-button" class="${"wrapper-25eVIn " + _v2__WEBPACK_IMPORTED_MODULE_1__["default"].guildClasses.circleButtonMask}">public</div>`);
|
|
label.addEventListener("click", () => {
|
|
this.render();
|
|
});
|
|
btn.append(label);
|
|
return btn;
|
|
}
|
|
|
|
_appendButton() {
|
|
let [classNametutorialContainer] = [_utils__WEBPACK_IMPORTED_MODULE_3__["default"].removeDa(BDModules.get(e => e.downloadProgress && e.tutorialContainer)[0].tutorialContainer)];
|
|
if (_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li")) return;
|
|
const guilds = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query(`div.${classNametutorialContainer} > div`);
|
|
_domtools__WEBPACK_IMPORTED_MODULE_4__["default"].after(guilds, this.button);
|
|
}
|
|
|
|
addButton() {
|
|
if (this.guildPatch) return;
|
|
const GuildList = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(m => m.default && m.default.displayName == "NavigableGuilds");
|
|
const GuildListOld = _webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].findByDisplayName("Guilds");
|
|
if (!GuildList && !GuildListOld) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].warn("PublicServer", "Can't find GuildList component");
|
|
this.guildPatch = _utils__WEBPACK_IMPORTED_MODULE_3__["default"].monkeyPatch(GuildList ? GuildList : GuildListOld.prototype, GuildList ? "default" : "render", {
|
|
after: this._appendButton
|
|
});
|
|
|
|
this._appendButton();
|
|
}
|
|
|
|
removeButton() {
|
|
this.guildPatch();
|
|
delete this.guildPatch;
|
|
const button = _domtools__WEBPACK_IMPORTED_MODULE_4__["default"].query("#bd-pub-li");
|
|
if (button) button.remove();
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/settingsPanel.js":
|
|
/*!**************************************!*\
|
|
!*** ./src/modules/settingsPanel.js ***!
|
|
\**************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsPanelSidebar */ "./src/modules/settingsPanelSidebar.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _coloredText__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./coloredText */ "./src/modules/coloredText.js");
|
|
/* harmony import */ var _24hour__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./24hour */ "./src/modules/24hour.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _publicServers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./publicServers */ "./src/modules/publicServers.js");
|
|
/* harmony import */ var _voiceMode__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./voiceMode */ "./src/modules/voiceMode.js");
|
|
/* harmony import */ var _classNormalizer__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./classNormalizer */ "./src/modules/classNormalizer.js");
|
|
/* harmony import */ var _devMode__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./devMode */ "./src/modules/devMode.js");
|
|
/* harmony import */ var _ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../ui/sectionedSettingsPanel */ "./src/ui/sectionedSettingsPanel.js");
|
|
/* harmony import */ var _ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../ui/cssEditor */ "./src/ui/cssEditor.js");
|
|
/* harmony import */ var _ui_addonlist__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../ui/addonlist */ "./src/ui/addonlist.jsx");
|
|
/* harmony import */ var _ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../ui/presenceSettings */ "./src/ui/presenceSettings.jsx");
|
|
/* harmony import */ var _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./CustomRichPresence */ "./src/modules/CustomRichPresence.js");
|
|
/* harmony import */ var _ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../ui/AccountInfos */ "./src/ui/AccountInfos.jsx");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_19___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_19__);
|
|
/* harmony import */ var _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./AntiAdDM */ "./src/modules/AntiAdDM.js");
|
|
/* harmony import */ var _blurPrivate__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./blurPrivate */ "./src/modules/blurPrivate.js");
|
|
/* harmony import */ var _disableTyping__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./disableTyping */ "./src/modules/disableTyping.js");
|
|
/* harmony import */ var _ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../ui/ApiPreview */ "./src/ui/ApiPreview.jsx");
|
|
/* harmony import */ var _ui_switch__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../ui/switch */ "./src/ui/switch.js");
|
|
/* harmony import */ var _ui_margintop__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../ui/margintop */ "./src/ui/margintop.jsx");
|
|
/* harmony import */ var _webpackModules__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../ui/tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
/* harmony import */ var _ui_icons_history__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../ui/icons/history */ "./src/ui/icons/history.jsx");
|
|
/* harmony import */ var _core__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./core */ "./src/modules/core.js");
|
|
/* harmony import */ var _popoutWindow__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./popoutWindow */ "./src/modules/popoutWindow.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class BDSidebarHeader extends React.PureComponent {
|
|
render() {
|
|
let sidebarComponents = _webpackModules__WEBPACK_IMPORTED_MODULE_26__["default"].find(e => e.Separator && e.Header && e.Item);
|
|
const changelogButton = React.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_27__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: "Changelog"
|
|
}, React.createElement("span", {
|
|
style: {
|
|
float: "right",
|
|
cursor: "pointer"
|
|
},
|
|
className: "bd-changelog-button",
|
|
onClick: () => {
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showChangelogModal(bbdChangelog);
|
|
}
|
|
}, React.createElement(_ui_icons_history__WEBPACK_IMPORTED_MODULE_28__["default"], {
|
|
className: "bd-icon",
|
|
size: "16px"
|
|
})));
|
|
let rendered = new sidebarComponents.Header({
|
|
children: React.createElement("span", null, "Bandaged BD", changelogButton),
|
|
className: "ui-tab-bar-header"
|
|
});
|
|
return rendered;
|
|
}
|
|
|
|
}
|
|
|
|
let isClearingCache = false;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class V2_SettingsPanel {
|
|
constructor() {
|
|
this.onChange = this.onChange.bind(this);
|
|
this.updateSettings = this.updateSettings.bind(this);
|
|
this.sidebar = new _settingsPanelSidebar__WEBPACK_IMPORTED_MODULE_2__["default"]();
|
|
this.registerComponents();
|
|
}
|
|
|
|
registerComponents() {
|
|
/** Lightcord */
|
|
this.sidebar.register("lightcord", makeComponent(this.lightcordComponent.bind(this)));
|
|
this.sidebar.register("status", makeComponent(this.PresenceComponent.bind(this)));
|
|
this.sidebar.register("accountinfo", makeComponent(this.AccountInfosComponent.bind(this)));
|
|
this.sidebar.register("lcapipreview", makeComponent(this.ApiPreviewComponent.bind(this)));
|
|
/* Bandaged BD */
|
|
|
|
this.sidebar.register("BDChangelogTitle", makeComponent(() => {
|
|
return new BDSidebarHeader().render();
|
|
}));
|
|
this.sidebar.register("core", makeComponent(this.coreComponent.bind(this)));
|
|
this.sidebar.register("customcss", makeComponent(this.customCssComponent.bind(this)));
|
|
this.sidebar.register("plugins", makeComponent(this.renderAddonPane("plugins")));
|
|
this.sidebar.register("themes", makeComponent(this.renderAddonPane("themes")));
|
|
}
|
|
|
|
get 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");
|
|
}
|
|
|
|
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;
|
|
}, []);
|
|
}
|
|
|
|
onChange(id, checked, sidebar) {
|
|
this.updateSettings(id, checked, sidebar);
|
|
}
|
|
|
|
updateSettings(id, enabled, sidebar) {
|
|
if (!["lightcord-8", "no_window_bound", "enable_glasstron", "lightcord-10"].includes(id)) _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][id] = enabled;
|
|
|
|
if (id == "bda-gs-2") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal");
|
|
}
|
|
|
|
if (id == "bda-gs-3") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(document.body, "bd-minimal-chan");
|
|
}
|
|
|
|
if (id == "bda-gs-1") {
|
|
if (enabled) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();else _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].removeButton();
|
|
}
|
|
|
|
if (id == "bda-gs-4") {
|
|
if (enabled) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();else _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].stop();
|
|
}
|
|
|
|
if (id == "bda-gs-5") {
|
|
if (enabled) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");else _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].removeClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
|
|
}
|
|
|
|
if (enabled && id == "bda-gs-6") _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
|
|
|
|
if (id == "bda-gs-7") {
|
|
if (enabled) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();else _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].removeColoredText();
|
|
}
|
|
|
|
if (id == "fork-ps-4") {
|
|
if (enabled) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();else _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].stop();
|
|
}
|
|
|
|
if (id == "fork-ps-5") {
|
|
if (enabled) {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
|
|
} else {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].unwatchContent("theme");
|
|
}
|
|
}
|
|
|
|
if (id == "fork-wp-1") {
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("transparent", enabled);
|
|
if (enabled) _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", null);else _utils__WEBPACK_IMPORTED_MODULE_3__["default"].setWindowPreference("backgroundColor", "#2f3136");
|
|
}
|
|
|
|
if (id == "bda-gs-8") {
|
|
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopDebugListener();
|
|
}
|
|
|
|
if (id == "fork-dm-1") {
|
|
if (enabled) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();else _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].stopCopySelector();
|
|
}
|
|
|
|
if (id === "lightcord-1") {
|
|
if (enabled) window.Lightcord.Settings.devMode = true;else window.Lightcord.Settings.devMode = false;
|
|
sidebar.forceUpdate();
|
|
}
|
|
|
|
if (id === "lightcord-2") {
|
|
if (enabled) window.Lightcord.Settings.callRingingBeat = true;else window.Lightcord.Settings.callRingingBeat = false;
|
|
}
|
|
|
|
if (id === "lightcord-presence-1") {
|
|
if (enabled) {
|
|
_CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable();
|
|
const settingsStore = BDModules.get(e => e.default && typeof e.default === "object" && "showCurrentGame" in e.default)[0];
|
|
|
|
if (settingsStore && !settingsStore.default.showCurrentGame) {
|
|
BDModules.get(e => e.default && e.default.updateRemoteSettings)[0].default.updateRemoteSettings({
|
|
showCurrentGame: true
|
|
});
|
|
}
|
|
} else _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].disable();
|
|
}
|
|
|
|
if (id === "lightcord-3") {
|
|
if (enabled) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);else electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(false);
|
|
}
|
|
|
|
if (id === "lightcord-4") {
|
|
if (enabled) {
|
|
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
|
|
} else {
|
|
_AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-6") {
|
|
if (enabled) {
|
|
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
|
|
} else {
|
|
_blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-7") {
|
|
if (enabled) {
|
|
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
|
|
} else {
|
|
_disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].disable();
|
|
}
|
|
}
|
|
|
|
if (id === "lightcord-8") {
|
|
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
|
|
appSettings.set("isTabs", enabled);
|
|
appSettings.save();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
|
|
}
|
|
|
|
if (id === "lightcord-9") {
|
|
_popoutWindow__WEBPACK_IMPORTED_MODULE_30__["default"][enabled ? "enable" : "disable"]();
|
|
}
|
|
|
|
if (id === "lightcord-10") {
|
|
_core__WEBPACK_IMPORTED_MODULE_29__["default"].methods.NotificationsUseShim(enabled);
|
|
return;
|
|
}
|
|
|
|
if (id === "no_window_bound") {
|
|
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
|
|
appSettings.set("NO_WINDOWS_BOUND", enabled);
|
|
appSettings.delete("IS_MAXIMIZED");
|
|
appSettings.delete("IS_MINIMIZED");
|
|
appSettings.delete("WINDOW_BOUNDS");
|
|
appSettings.save();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
|
|
}
|
|
|
|
if (id === "enable_glasstron") {
|
|
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
|
|
appSettings.set("GLASSTRON", enabled);
|
|
appSettings.save();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.exit();
|
|
}
|
|
|
|
this.saveSettings();
|
|
}
|
|
|
|
async initializeSettings() {
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-2"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-3"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(document.body, "bd-minimal-chan");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-1"]) _publicServers__WEBPACK_IMPORTED_MODULE_9__["default"].addButton();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-4"]) _voiceMode__WEBPACK_IMPORTED_MODULE_10__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-5"]) _domtools__WEBPACK_IMPORTED_MODULE_8__["default"].addClass(_domtools__WEBPACK_IMPORTED_MODULE_8__["default"].query("#app-mount"), "bda-dark");
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-6"]) _24hour__WEBPACK_IMPORTED_MODULE_7__["default"].inject24Hour();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-7"]) _coloredText__WEBPACK_IMPORTED_MODULE_6__["default"].injectColoredText();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-4"]) _classNormalizer__WEBPACK_IMPORTED_MODULE_11__["default"].start();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-1"]) window.Lightcord.Settings.devMode = true;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-2"]) window.Lightcord.Settings.callRingingBeat = true;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-presence-1"]) _CustomRichPresence__WEBPACK_IMPORTED_MODULE_17__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-3"]) electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWindow().setAlwaysOnTop(true);
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-4"]) _AntiAdDM__WEBPACK_IMPORTED_MODULE_20__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-6"]) _blurPrivate__WEBPACK_IMPORTED_MODULE_21__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-7"]) _disableTyping__WEBPACK_IMPORTED_MODULE_22__["default"].enable();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["lightcord-9"]) _popoutWindow__WEBPACK_IMPORTED_MODULE_30__["default"].enable();
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-5"]) {
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("plugin");
|
|
_contentManager__WEBPACK_IMPORTED_MODULE_5__["default"].watchContent("theme");
|
|
}
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["bda-gs-8"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startDebugListener();
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-dm-1"]) _devMode__WEBPACK_IMPORTED_MODULE_12__["default"].startCopySelector();
|
|
this.saveSettings();
|
|
}
|
|
|
|
saveSettings() {
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("settings", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]);
|
|
_dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"]);
|
|
}
|
|
|
|
loadSettings() {
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("settings"));
|
|
Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsRPC"], _dataStore__WEBPACK_IMPORTED_MODULE_1__["default"].getSettingGroup("rpc"));
|
|
}
|
|
|
|
renderSidebar(sidebar) {
|
|
return this.sidebar.render(sidebar);
|
|
}
|
|
|
|
coreComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_sectionedSettingsPanel__WEBPACK_IMPORTED_MODULE_13__["default"], {
|
|
key: "cspanel",
|
|
onChange: this.onChange,
|
|
sections: this.coreSettings
|
|
});
|
|
}
|
|
|
|
lightcordComponent(sidebar, forceUpdate) {
|
|
let appSettings = electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getGlobal("appSettings");
|
|
return [this.lightcordSettings.map((section, i) => {
|
|
return [i === 0 ? null : _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_margintop__WEBPACK_IMPORTED_MODULE_25__["default"]), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20"
|
|
}, section.title), section.settings.map(setting => {
|
|
let isChecked = _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id];
|
|
if (setting.id === "lightcord-8") isChecked = appSettings.get("isTabs", false);
|
|
if (setting.id === "no_window_bound") isChecked = appSettings.get("NO_WINDOWS_BOUND", false);
|
|
if (setting.id === "enable_glasstron") isChecked = appSettings.get("GLASSTRON", true);
|
|
if (setting.id === "lightcord-10") isChecked = !appSettings.get("DEFAULT_NOTIFICATIONS", true);
|
|
let returnValue = _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_switch__WEBPACK_IMPORTED_MODULE_24__["default"], {
|
|
id: setting.id,
|
|
key: setting.id,
|
|
data: setting,
|
|
checked: isChecked,
|
|
onChange: (id, checked) => {
|
|
this.onChange(id, checked, sidebar);
|
|
}
|
|
});
|
|
|
|
if (setting.id == "lightcord-8" && isChecked) {
|
|
return [returnValue, React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
color: "green",
|
|
look: "outlined",
|
|
size: "small",
|
|
hoverColor: "brand",
|
|
onClick: () => {
|
|
DiscordNative.ipc.send("NEW_TAB");
|
|
},
|
|
wrapper: false,
|
|
disabled: false
|
|
}, "Open a new Tab")];
|
|
}
|
|
|
|
return returnValue;
|
|
})];
|
|
}), _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(window.Lightcord.Api.Components.inputs.Button, {
|
|
color: "yellow",
|
|
look: "ghost",
|
|
size: "medium",
|
|
hoverColor: "red",
|
|
|
|
onClick() {
|
|
console.log("Should relaunch");
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.relaunch({
|
|
args: electron__WEBPACK_IMPORTED_MODULE_19__["remote"].process.argv.slice(1).concat(["--disable-betterdiscord"])
|
|
});
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].app.quit();
|
|
},
|
|
|
|
wrapper: true
|
|
}, "Relaunch without BetterDiscord"), React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
color: "yellow",
|
|
look: "ghost",
|
|
size: "medium",
|
|
hoverColor: "red",
|
|
onClick: () => {
|
|
if (isClearingCache) return;
|
|
isClearingCache = true;
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Clearing cache...", {
|
|
type: "info"
|
|
});
|
|
forceUpdate();
|
|
electron__WEBPACK_IMPORTED_MODULE_19__["remote"].getCurrentWebContents().session.clearCache().then(() => {
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("Cache is cleared !", {
|
|
type: "success"
|
|
});
|
|
isClearingCache = false;
|
|
forceUpdate();
|
|
}).catch(err => {
|
|
console.error(err);
|
|
_utils__WEBPACK_IMPORTED_MODULE_3__["default"].showToast("An error occured. Check console for more informations.", {
|
|
type: "error"
|
|
});
|
|
isClearingCache = false;
|
|
forceUpdate();
|
|
});
|
|
},
|
|
wrapper: true,
|
|
disabled: isClearingCache
|
|
}, "Clear cache")];
|
|
}
|
|
|
|
PresenceComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_presenceSettings__WEBPACK_IMPORTED_MODULE_16__["default"], {
|
|
key: "lppannel",
|
|
onChange: this.onChange,
|
|
settings: this.PresenceSettings
|
|
});
|
|
}
|
|
|
|
AccountInfosComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_AccountInfos__WEBPACK_IMPORTED_MODULE_18__["default"], {
|
|
key: "lapannel"
|
|
});
|
|
}
|
|
|
|
ApiPreviewComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_ApiPreview__WEBPACK_IMPORTED_MODULE_23__["default"], {
|
|
key: "lapipannel"
|
|
});
|
|
}
|
|
|
|
customCssComponent() {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_cssEditor__WEBPACK_IMPORTED_MODULE_14__["default"], {
|
|
key: "csseditor"
|
|
});
|
|
}
|
|
|
|
renderAddonPane(type) {
|
|
// I know this shouldn't be here, but when it isn't,
|
|
// React refuses to change the button when going
|
|
// between plugins and themes page... something
|
|
// to debug later.
|
|
class ContentList extends _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.prefix = this.props.type.replace("s", "");
|
|
}
|
|
|
|
onChange() {
|
|
this.props.onChange(this.props.type);
|
|
}
|
|
|
|
render() {
|
|
return this.props.children;
|
|
}
|
|
|
|
}
|
|
|
|
const originalRender = ContentList.prototype.render;
|
|
Object.defineProperty(ContentList.prototype, "render", {
|
|
enumerable: false,
|
|
configurable: false,
|
|
set: function () {
|
|
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
|
|
},
|
|
get: () => originalRender
|
|
});
|
|
return function () {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(ContentList, {
|
|
type
|
|
}, _v2__WEBPACK_IMPORTED_MODULE_4__["default"].react.createElement(_ui_addonlist__WEBPACK_IMPORTED_MODULE_15__["default"], {
|
|
type
|
|
}));
|
|
};
|
|
}
|
|
|
|
}());
|
|
/**
|
|
* No need to export settingsPanel on window
|
|
*/
|
|
|
|
function makeComponent(children) {
|
|
class SettingComponent extends React.Component {
|
|
render() {
|
|
return children(sidebar, () => this.forceUpdate());
|
|
}
|
|
|
|
}
|
|
|
|
let sidebar;
|
|
return s => {
|
|
sidebar = s;
|
|
return SettingComponent;
|
|
};
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/settingsPanelSidebar.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/modules/settingsPanelSidebar.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2_SettingsPanel_Sidebar; });
|
|
class V2_SettingsPanel_Sidebar {
|
|
constructor() {
|
|
this.panels = {};
|
|
}
|
|
|
|
register(panel, component) {
|
|
this.panels[panel] = component;
|
|
}
|
|
|
|
getComponent(panel, sidebar) {
|
|
return this.panels[panel](sidebar);
|
|
}
|
|
|
|
get items() {
|
|
return [{
|
|
text: "BetterDiscord Settings",
|
|
id: "core"
|
|
}, {
|
|
text: "Plugins",
|
|
id: "plugins"
|
|
}, {
|
|
text: "Themes",
|
|
id: "themes"
|
|
}, {
|
|
text: "Custom CSS",
|
|
id: "customcss"
|
|
}];
|
|
}
|
|
|
|
get LCitems() {
|
|
let items = [{
|
|
text: "Lightcord Settings",
|
|
id: "lightcord"
|
|
}, {
|
|
text: "RichPresence",
|
|
id: "status"
|
|
}, {
|
|
text: "Account Info",
|
|
id: "accountinfo"
|
|
}];
|
|
return items;
|
|
}
|
|
|
|
get LCDevItems() {
|
|
let items = [];
|
|
if (!window.Lightcord.Settings.devMode) return items;
|
|
items.push(...[{
|
|
section: "DIVIDER"
|
|
}, {
|
|
section: "HEADER",
|
|
label: "Lightcord Api"
|
|
}, {
|
|
text: "Components Preview",
|
|
id: "lcapipreview"
|
|
}]);
|
|
return items;
|
|
}
|
|
|
|
render(sidebar) {
|
|
return [{
|
|
section: "HEADER",
|
|
label: "Lightcord"
|
|
}, ...this.LCitems.map(e => {
|
|
return {
|
|
section: e.id,
|
|
label: e.text,
|
|
element: this.getComponent(e.id, sidebar)
|
|
};
|
|
}), ...this.LCDevItems.map(e => {
|
|
if (e.section) return e;
|
|
return {
|
|
section: e.id,
|
|
label: e.text,
|
|
element: this.getComponent(e.id, sidebar)
|
|
};
|
|
}), {
|
|
section: "DIVIDER"
|
|
}, {
|
|
section: "CUSTOM",
|
|
element: this.getComponent("BDChangelogTitle")
|
|
}, ...this.items.map(e => {
|
|
return {
|
|
section: e.id,
|
|
label: e.text,
|
|
element: this.getComponent(e.id, sidebar)
|
|
};
|
|
}), {
|
|
section: "DIVIDER"
|
|
}];
|
|
}
|
|
|
|
}
|
|
/**
|
|
* No need to export settingsPanelSidebar on window
|
|
*/
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/themeModule.js":
|
|
/*!************************************!*\
|
|
!*** ./src/modules/themeModule.js ***!
|
|
\************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _contentManager__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _dataStore__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _bdEvents__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ThemeModule {
|
|
constructor() {
|
|
window.Lightcord.BetterDiscord.ThemeModule = this;
|
|
}
|
|
|
|
get folder() {
|
|
return _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder;
|
|
}
|
|
|
|
}
|
|
|
|
ThemeModule.prototype.loadThemes = async function () {
|
|
this.loadThemeData();
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemeErrors"].splice(0, 0, ...(await _contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].loadThemes()));
|
|
const themes = Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"]);
|
|
|
|
for (let i = 0; i < themes.length; i++) {
|
|
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][themes[i]];
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name] = false;
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme.name]) _domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
|
|
await new Promise(resolve => setTimeout(resolve, 10));
|
|
}
|
|
|
|
for (const theme in _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"]) {
|
|
if (!_0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][theme]) delete _0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][theme];
|
|
}
|
|
|
|
this.saveThemeData(); // if (settingsCookie["fork-ps-5"]) ContentManager.watchContent("theme");
|
|
};
|
|
|
|
ThemeModule.prototype.enableTheme = function (name, reload = false) {
|
|
_0globals__WEBPACK_IMPORTED_MODULE_0__["themeCookie"][name] = true;
|
|
this.saveThemeData();
|
|
const theme = _0globals__WEBPACK_IMPORTED_MODULE_0__["bdthemes"][name];
|
|
_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].addStyle(_domtools__WEBPACK_IMPORTED_MODULE_5__["default"].escapeID(theme.id), unescape(theme.css));
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-enabled");
|
|
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));
|
|
_bdEvents__WEBPACK_IMPORTED_MODULE_3__["default"].dispatch("theme-disabled");
|
|
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) {
|
|
return this.toggleTheme(name);
|
|
};
|
|
|
|
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 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.unloadTheme(bdtheme.filename);
|
|
|
|
const fullPath = __webpack_require__(/*! path */ "path").resolve(_contentManager__WEBPACK_IMPORTED_MODULE_1__["default"].themesFolder, bdtheme.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("." + removeDa(BDModules.get(e => e.channelTextArea && e.titleWrapper)[0].channelTextArea) + " 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();
|
|
}
|
|
}
|
|
/**
|
|
* Format strings with placeholders (`{{placeholder}}`) into full strings.
|
|
* Quick example: `PluginUtilities.formatString("Hello, {{user}}", {user: "Zerebos"})`
|
|
* would return "Hello, Zerebos".
|
|
* @param {string} string - string to format
|
|
* @param {object} values - object literal of placeholders to replacements
|
|
* @returns {string} the properly formatted string
|
|
*/
|
|
|
|
|
|
static formatString(string, values) {
|
|
for (const val in values) {
|
|
let replacement = values[val];
|
|
if (Array.isArray(replacement)) replacement = JSON.stringify(replacement);
|
|
if (typeof replacement === "object" && replacement !== null) replacement = replacement.toString();
|
|
string = string.replace(new RegExp(`{{${val}}}`, "g"), replacement);
|
|
}
|
|
|
|
return string;
|
|
}
|
|
|
|
static escape(s) {
|
|
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
}
|
|
|
|
static testJSON(data) {
|
|
try {
|
|
return JSON.parse(data);
|
|
} catch (err) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
static isEmpty(obj) {
|
|
if (obj == null || obj == undefined || obj == "") return true;
|
|
if (typeof obj !== "object") return false;
|
|
if (Array.isArray(obj)) return obj.length == 0;
|
|
|
|
for (const key in obj) {
|
|
if (obj.hasOwnProperty(key)) return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static suppressErrors(method, message) {
|
|
return (...params) => {
|
|
try {
|
|
return method(...params);
|
|
} catch (e) {
|
|
this.err("SuppressedError", "Error occurred in " + message, e);
|
|
}
|
|
};
|
|
}
|
|
|
|
static monkeyPatch(what, methodName, options) {
|
|
const {
|
|
before,
|
|
after,
|
|
instead,
|
|
once = false,
|
|
silent = false,
|
|
force = false
|
|
} = options;
|
|
const displayName = options.displayName || what.displayName || what[methodName].displayName || what.name || what.constructor.displayName || what.constructor.name;
|
|
if (!silent) console.log("patch", methodName, "of", displayName); // eslint-disable-line no-console
|
|
|
|
if (!what[methodName]) {
|
|
if (force) what[methodName] = function () {};else return console.error(methodName, "does not exist for", displayName); // eslint-disable-line no-console
|
|
}
|
|
|
|
const origMethod = what[methodName];
|
|
let canceled = false;
|
|
|
|
const cancel = () => {
|
|
if (!silent) console.log("unpatch", methodName, "of", displayName); // eslint-disable-line no-console
|
|
//what[methodName] = origMethod;
|
|
|
|
canceled = true; // this allow to monkeypatch more than one time.
|
|
};
|
|
|
|
what[methodName] = function () {
|
|
if (canceled) {
|
|
return origMethod.call(this, ...arguments);
|
|
}
|
|
|
|
const data = {
|
|
thisObject: this,
|
|
methodArguments: arguments,
|
|
cancelPatch: cancel,
|
|
originalMethod: origMethod,
|
|
callOriginalMethod: () => data.returnValue = data.originalMethod.apply(data.thisObject, data.methodArguments)
|
|
};
|
|
|
|
if (instead) {
|
|
const tempRet = Utils.suppressErrors(instead, "`instead` callback of " + what[methodName].displayName)(data);
|
|
if (tempRet !== undefined) data.returnValue = tempRet;
|
|
} else {
|
|
if (before) Utils.suppressErrors(before, "`before` callback of " + what[methodName].displayName)(data);
|
|
data.callOriginalMethod();
|
|
if (after) Utils.suppressErrors(after, "`after` callback of " + what[methodName].displayName)(data);
|
|
}
|
|
|
|
if (once) cancel();
|
|
return data.returnValue;
|
|
};
|
|
|
|
Object.assign(what[methodName], origMethod);
|
|
what[methodName].__monkeyPatched = true;
|
|
what[methodName].displayName = displayName;
|
|
|
|
if (!what[methodName].__originalMethod) {
|
|
what[methodName].__originalMethod = origMethod;
|
|
|
|
what[methodName].toString = function () {
|
|
return origMethod.toString();
|
|
};
|
|
}
|
|
|
|
return cancel;
|
|
}
|
|
|
|
static onRemoved(node, callback) {
|
|
const observer = new MutationObserver(mutations => {
|
|
for (let m = 0; m < mutations.length; m++) {
|
|
const mutation = mutations[m];
|
|
const nodes = Array.from(mutation.removedNodes);
|
|
const directMatch = nodes.indexOf(node) > -1;
|
|
const parentMatch = nodes.some(parent => parent.contains(node));
|
|
|
|
if (directMatch || parentMatch) {
|
|
observer.disconnect();
|
|
callback();
|
|
}
|
|
}
|
|
});
|
|
observer.observe(document.body, {
|
|
subtree: true,
|
|
childList: true
|
|
});
|
|
}
|
|
|
|
static getNestedProp(obj, path) {
|
|
return path.split(/\s?\.\s?/).reduce(function (obj, prop) {
|
|
return obj && obj[prop];
|
|
}, obj);
|
|
}
|
|
/**
|
|
* This shows a toast similar to android towards the bottom of the screen.
|
|
*
|
|
* @param {string} content The string to show in the toast.
|
|
* @param {object} options Options object. Optional parameter.
|
|
* @param {string} options.type Changes the type of the toast stylistically and semantically. Choices: "", "info", "success", "danger"/"error", "warning"/"warn". Default: ""
|
|
* @param {boolean} options.icon Determines whether the icon should show corresponding to the type. A toast without type will always have no icon. Default: true
|
|
* @param {number} options.timeout Adjusts the time (in ms) the toast should be shown for before disappearing automatically. Default: 3000
|
|
*/
|
|
|
|
|
|
static showToast(content, options = {}) {
|
|
if (!document.querySelector(".bd-toasts")) {
|
|
const container = document.querySelector("." + removeDa(BDModules.get(e => e.sidebar && e.hasNotice)[0].sidebar) + " + div") || null;
|
|
const form = container ? container.querySelector("form") : null;
|
|
const bottom = form ? form.offsetHeight : 80;
|
|
const toastWrapper = document.createElement("div");
|
|
toastWrapper.classList.add("bd-toasts");
|
|
toastWrapper.style.setProperty("bottom", bottom + "px");
|
|
document.querySelector("#app-mount").appendChild(toastWrapper);
|
|
}
|
|
|
|
const toastWrapper = document.querySelector(".bd-toasts");
|
|
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;
|
|
toastWrapper.appendChild(toastElem);
|
|
toastWrapper.style.setProperty("left", `calc(50% - ${toastWrapper.offsetWidth / 2}px)`);
|
|
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 ModalActions = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByProps("openModal", "updateModal");
|
|
const Markdown = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("Markdown");
|
|
const ConfirmationModal = _webpackModules__WEBPACK_IMPORTED_MODULE_1__["default"].findByDisplayName("ConfirmModal");
|
|
if (!ModalActions || !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 ModalActions.openModal(props => {
|
|
return _v2__WEBPACK_IMPORTED_MODULE_2__["default"].React.createElement(ConfirmationModal, Object.assign({
|
|
header: title,
|
|
red: danger,
|
|
confirmText: confirmText,
|
|
cancelText: cancelText,
|
|
onConfirm: onConfirm,
|
|
onCancel: onCancel
|
|
}, props), content);
|
|
}, {
|
|
modalKey: key
|
|
});
|
|
}
|
|
|
|
static get removeDa() {
|
|
return removeDa;
|
|
}
|
|
|
|
}
|
|
|
|
function 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 import */ var _themeModule__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./themeModule */ "./src/modules/themeModule.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, isDefault) => {
|
|
let mod = !isDefault ? theModule.default : theModule;
|
|
if (!mod) return theModule;
|
|
if (mod.remove && mod.set && mod.clear && mod.get && !mod.sort) return null;
|
|
if (!mod.getToken && !mod.getEmail && !mod.showToken) return theModule;
|
|
const proxy = new Proxy(mod, {
|
|
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" && obj.getToken) return () => "mfa.XCnbKzo0CLIqdJzBnL0D8PfDruqkJNHjwHXtr39UU3F8hHx43jojISyi5jdjO52e9_e9MjmafZFFpc-seOMa";
|
|
if (func == "getEmail" && obj.getEmail) return () => "puppet11112@gmail.com";
|
|
if (func == "showToken" && obj.showToken) return () => true;
|
|
if (func == "__proto__" && obj.__proto__) return proxy;
|
|
return obj[func];
|
|
}
|
|
});
|
|
|
|
if (!isDefault) {
|
|
return Object.assign({}, theModule, {
|
|
default: proxy
|
|
});
|
|
}
|
|
|
|
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, true);
|
|
if (m && filter(m)) return protect(m, false);
|
|
}
|
|
} // 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, true));else if (m && filter(m)) modules.push(protect(m, false));
|
|
}
|
|
}
|
|
|
|
return modules;
|
|
};
|
|
|
|
const findByUniqueProperties = propNames => find(module => propNames.every(prop => module[prop] !== undefined));
|
|
|
|
const findByPrototypes = protoNames => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
|
|
|
|
const findByDisplayName = displayName => find(module => module.displayName === displayName);
|
|
|
|
return {
|
|
find,
|
|
findAll,
|
|
findByUniqueProperties,
|
|
findByPrototypes,
|
|
findByDisplayName
|
|
};
|
|
})();
|
|
|
|
this.internal = {
|
|
react: this.WebpackModules.findByUniqueProperties(["Component", "PureComponent", "Children", "createElement", "cloneElement"]),
|
|
reactDom: this.WebpackModules.findByUniqueProperties(["findDOMNode"])
|
|
};
|
|
|
|
this.getInternalInstance = e => e[Object.keys(e).find(k => k.startsWith("__reactInternalInstance"))];
|
|
|
|
window.Lightcord.BetterDiscord.V2 = this;
|
|
}
|
|
|
|
initialize() {}
|
|
|
|
joinBD1() {
|
|
this.InviteActions.acceptInviteAndTransitionToInviteChannel("0Tmfo5ZbORCRqbAd");
|
|
}
|
|
|
|
leaveBD1() {
|
|
this.GuildActions.leaveGuild("86004744966914048");
|
|
}
|
|
|
|
joinBD2() {
|
|
this.InviteActions.acceptInviteAndTransitionToInviteChannel("2HScm8j");
|
|
}
|
|
|
|
leaveBD2() {
|
|
this.GuildActions.leaveGuild("280806472928198656");
|
|
}
|
|
|
|
joinLC() {
|
|
this.InviteActions.acceptInviteAndTransitionToInviteChannel("7eFff2A");
|
|
}
|
|
|
|
leaveLC() {
|
|
this.GuildActions.leaveGuild("705908350218666117");
|
|
}
|
|
/**
|
|
* @type {typeof React}
|
|
*/
|
|
|
|
|
|
get react() {
|
|
return this.internal.react;
|
|
}
|
|
/**
|
|
* @type {typeof React}
|
|
*/
|
|
|
|
|
|
get React() {
|
|
return this.internal.react;
|
|
}
|
|
/**
|
|
* @type {typeof import("react-dom")}
|
|
*/
|
|
|
|
|
|
get reactDom() {
|
|
return this.internal.reactDom;
|
|
}
|
|
/**
|
|
* @type {typeof import("react-dom")}
|
|
*/
|
|
|
|
|
|
get ReactDom() {
|
|
return this.internal.reactDom;
|
|
}
|
|
/**
|
|
* @type {typeof React.Component}
|
|
*/
|
|
|
|
|
|
get reactComponent() {
|
|
return this.internal.react.Component;
|
|
}
|
|
/**
|
|
* @type {typeof React.Component}
|
|
*/
|
|
|
|
|
|
get ReactComponent() {
|
|
return this.internal.react.Component;
|
|
}
|
|
|
|
get anchorClasses() {
|
|
return this.WebpackModules.findByUniqueProperties(["anchorUnderlineOnHover"]) || {
|
|
anchor: "anchor-3Z-8Bb",
|
|
anchorUnderlineOnHover: "anchorUnderlineOnHover-2ESHQB"
|
|
};
|
|
}
|
|
|
|
get slateEditorClasses() {
|
|
return this.WebpackModules.findByUniqueProperties(["slateTextArea"]);
|
|
}
|
|
|
|
get messageClasses() {
|
|
return this.WebpackModules.findByUniqueProperties(["message", "containerCozy"]);
|
|
}
|
|
|
|
get guildClasses() {
|
|
const guildsWrapper = BDModules.get(e => e.wrapper && e.unreadMentionsBar)[0];
|
|
const guilds = BDModules.get(e => e.guildsError && e.selected)[0];
|
|
const pill = BDModules.get(e => e.blobContainer)[0];
|
|
return Object.assign({}, guildsWrapper, guilds, pill);
|
|
}
|
|
|
|
get MessageContentComponent() {
|
|
return this.WebpackModules.find(m => m.defaultProps && m.defaultProps.hasOwnProperty("disableButtons"));
|
|
}
|
|
|
|
get MessageComponent() {
|
|
return this.WebpackModules.find(m => m.default && m.default.displayName && m.default.displayName == "Message");
|
|
}
|
|
|
|
get TimeFormatter() {
|
|
return this.WebpackModules.findByUniqueProperties(["dateFormat"]);
|
|
}
|
|
|
|
get TooltipWrapper() {
|
|
return this.WebpackModules.findByDisplayName("Tooltip");
|
|
}
|
|
|
|
get NativeModule() {
|
|
return this.WebpackModules.findByUniqueProperties(["setBadge"]);
|
|
}
|
|
|
|
get InviteActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["acceptInvite"]);
|
|
}
|
|
|
|
get GuildActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["leaveGuild"]);
|
|
}
|
|
|
|
get Tooltips() {
|
|
return this.WebpackModules.find(m => m.hide && m.show && !m.search && !m.submit && !m.search && !m.activateRagingDemon && !m.dismiss);
|
|
}
|
|
|
|
get KeyGenerator() {
|
|
return this.WebpackModules.find(m => m.toString && /"binary"/.test(m.toString()));
|
|
}
|
|
|
|
get LayerStack() {
|
|
return this.WebpackModules.findByUniqueProperties(["popLayer"]);
|
|
}
|
|
|
|
get UserStore() {
|
|
return this.WebpackModules.findByUniqueProperties(["getCurrentUser"]);
|
|
}
|
|
|
|
get ChannelStore() {
|
|
return this.WebpackModules.findByUniqueProperties(["getChannel"]);
|
|
}
|
|
|
|
get ChannelActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["openPrivateChannel"]);
|
|
}
|
|
|
|
get PrivateChannelActions() {
|
|
return this.WebpackModules.findByUniqueProperties(["selectPrivateChannel"]);
|
|
}
|
|
|
|
openDM(userId) {
|
|
const selfId = this.UserStore.getCurrentUser().id;
|
|
if (selfId == userId) return;
|
|
const privateChannelId = this.ChannelStore.getDMFromUserId(userId);
|
|
if (privateChannelId) return this.PrivateChannelActions.selectPrivateChannel(privateChannelId);
|
|
this.ChannelActions.openPrivateChannel(selfId, userId);
|
|
}
|
|
|
|
parseSettings(cat) {
|
|
return Object.keys(_0globals__WEBPACK_IMPORTED_MODULE_0__["settings"]).reduce((arr, key) => {
|
|
const setting = _0globals__WEBPACK_IMPORTED_MODULE_0__["settings"][key];
|
|
|
|
if (setting.cat === cat && setting.implemented && !setting.hidden) {
|
|
setting.text = key;
|
|
arr.push(setting);
|
|
}
|
|
|
|
return arr;
|
|
}, []);
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/voiceMode.js":
|
|
/*!**********************************!*\
|
|
!*** ./src/modules/voiceMode.js ***!
|
|
\**********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony import */ var _domtools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./domtools */ "./src/modules/domtools.js");
|
|
|
|
const style = `
|
|
.container-2Rl01u {
|
|
display: none!important;
|
|
}
|
|
|
|
.chat-3bRxxu {
|
|
display: none!important;
|
|
}
|
|
|
|
.sidebar-2K8pFh {
|
|
flex-grow: 1!important;
|
|
}
|
|
`;
|
|
/* harmony default export */ __webpack_exports__["default"] = (new class VoiceMode {
|
|
start() {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].addStyle("VoiceMode", style);
|
|
}
|
|
|
|
stop() {
|
|
_domtools__WEBPACK_IMPORTED_MODULE_0__["default"].removeStyle("VoiceMode");
|
|
}
|
|
|
|
}());
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/modules/webpackModules.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/modules/webpackModules.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
const req = webpackJsonp.push([[], {
|
|
__extra_id__: (module, exports, req) => module.exports = req
|
|
}, [["__extra_id__"]]]);
|
|
delete req.m.__extra_id__;
|
|
delete req.c.__extra_id__;
|
|
|
|
const find = filter => {
|
|
for (const i in req.c) {
|
|
if (req.c.hasOwnProperty(i)) {
|
|
const m = req.c[i].exports;
|
|
if (m && m.__esModule && m.default && filter(m.default)) return m.default;
|
|
if (m && filter(m)) return m;
|
|
}
|
|
} // console.warn("Cannot find loaded module in cache");
|
|
|
|
|
|
return null;
|
|
};
|
|
|
|
const findAll = filter => {
|
|
const modules = [];
|
|
|
|
for (const i in req.c) {
|
|
if (req.c.hasOwnProperty(i)) {
|
|
const m = req.c[i].exports;
|
|
if (m && m.__esModule && m.default && filter(m.default)) modules.push(m.default);else if (m && filter(m)) modules.push(m);
|
|
}
|
|
}
|
|
|
|
return modules;
|
|
};
|
|
|
|
const findByProps = (...propNames) => find(module => propNames.every(prop => module[prop] !== undefined));
|
|
|
|
const findByPrototypes = (...protoNames) => find(module => module.prototype && protoNames.every(protoProp => module.prototype[protoProp] !== undefined));
|
|
|
|
const findByDisplayName = displayName => find(module => module.displayName === displayName);
|
|
|
|
let mod = {
|
|
find,
|
|
findAll,
|
|
findByProps,
|
|
findByPrototypes,
|
|
findByDisplayName
|
|
};
|
|
/* harmony default export */ __webpack_exports__["default"] = (mod);
|
|
window.Lightcord.BetterDiscord.WebpackModules = mod;
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/svg/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 /*#__PURE__*/React.createElement("svg", _extends({
|
|
viewBox: "0 0 31.3 29.5"
|
|
}, props.svg, {
|
|
height: "100%"
|
|
}), /*#__PURE__*/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)"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
d: "M22.1 12.3c-2.5 3.2-6.1 4.8-8.9 4.3L3.6 28.8c-.7.9-1.9 1-2.8.3-.9-.7-1-1.9-.4-2.8L10 14.1c-1.3-2.5-.6-6.4 2-9.7 3.2-4 8-5.5 10.8-3.4s2.4 7.2-.7 11.3z",
|
|
fill: "#e30613"
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/svg/circus.jsx":
|
|
/*!****************************!*\
|
|
!*** ./src/svg/circus.jsx ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Circus; });
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
|
|
class Circus extends React.Component {
|
|
render() {
|
|
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
viewBox: "0 0 36 36"
|
|
}, this.props.svg, {
|
|
height: "100%"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
fill: "#DD2E44",
|
|
d: "M33 33a2 2 0 01-2 2H5a2 2 0 01-2-2l1-12h28l1 12z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
fill: "#EA596E",
|
|
d: "M13 35c-.792-1.875-1.75-3.291-3.417-4.666 1.75-1.459 4.542-5.5 5.25-8.292s2.75 8.125 2.042 10.625S13 35 13 35zm10.303 0c.791-1.875 1.75-3.291 3.416-4.666-1.75-1.459-4.541-5.5-5.25-8.292-.707-2.792-2.75 8.125-2.04 10.625.708 2.5 3.874 2.333 3.874 2.333z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
fill: "#BE1931",
|
|
d: "M3.728 24.263A2.5 2.5 0 008 22.5c0-.565-.195-1.081-.511-1.5H4l-.272 3.263zm28.544 0L32 21h-3.489A2.482 2.482 0 0028 22.5a2.5 2.5 0 004.272 1.763z"
|
|
}), /*#__PURE__*/React.createElement("circle", {
|
|
cx: "14",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), /*#__PURE__*/React.createElement("circle", {
|
|
cx: "22",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), /*#__PURE__*/React.createElement("circle", {
|
|
cx: "10",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), /*#__PURE__*/React.createElement("circle", {
|
|
cx: "26",
|
|
cy: "23",
|
|
r: "2",
|
|
fill: "#BE1931"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
d: "M23 35H13s2-6 2-13h6c0 7 2 13 2 13zM17 2h2v7h-2z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
fill: "#55ACEE",
|
|
d: "M18.838.206C17.667.042 17 .318 17 1.418v1c0 1.1.865 1.753 1.923 1.451l5.154-.901c1.715-.343 1.548-1.593.085-1.884L18.838.206z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
fill: "#CCD6DD",
|
|
d: "M18 6l-.081.123C10.938 16.981 3 15.015 3 19v2.5a2.5 2.5 0 004.95.5H12a2 2 0 004 0h4a2 2 0 004 0h4.05a2.5 2.5 0 004.95-.5V19c0-4-8-2-15-13z"
|
|
}), /*#__PURE__*/React.createElement("g", {
|
|
fill: "#F5F8FA"
|
|
}, /*#__PURE__*/React.createElement("path", {
|
|
d: "M17.948 6.078l-.03.045C17.132 11.619 10.811 16.126 8 18v4a2 2 0 004 0v-4c.982-.982 5.813-6.787 5.984-11.732-.01-.064-.027-.126-.036-.19zm.08.398C18.324 11.374 23.031 17.031 24 18v4a2 2 0 004 0v-4c-2.75-1.833-8.953-6.19-9.972-11.524z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
d: "M17.984 6.27C17.922 8.346 17.606 16.394 16 18v4a2 2 0 004 0v-4c-1.564-1.564-1.905-9.241-1.979-11.559-.011-.057-.027-.113-.037-.171z"
|
|
})));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/svg/lightcord.jsx":
|
|
/*!*******************************!*\
|
|
!*** ./src/svg/lightcord.jsx ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LightcordLogo; });
|
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
|
|
|
class LightcordLogo extends React.Component {
|
|
render() {
|
|
const props = this.props;
|
|
return /*#__PURE__*/React.createElement("svg", _extends({
|
|
viewBox: "0 0 168 168.69"
|
|
}, props, {
|
|
height: "100%",
|
|
width: props.size
|
|
}), /*#__PURE__*/React.createElement("defs", null, /*#__PURE__*/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"
|
|
}, /*#__PURE__*/React.createElement("stop", {
|
|
offset: 0,
|
|
stopColor: "#e30613"
|
|
}), /*#__PURE__*/React.createElement("stop", {
|
|
offset: 1,
|
|
stopColor: "#731a14"
|
|
})), /*#__PURE__*/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"
|
|
}, /*#__PURE__*/React.createElement("stop", {
|
|
offset: 0,
|
|
stopColor: "#e20613"
|
|
}), /*#__PURE__*/React.createElement("stop", {
|
|
offset: 1,
|
|
stopColor: "#731a13"
|
|
})), /*#__PURE__*/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"
|
|
}, /*#__PURE__*/React.createElement("stop", {
|
|
offset: 0,
|
|
stopColor: "#e30613"
|
|
}), /*#__PURE__*/React.createElement("stop", {
|
|
offset: 1,
|
|
stopColor: "#731a13"
|
|
}))), /*#__PURE__*/React.createElement("path", {
|
|
fill: "#fff",
|
|
d: "M14.9 35.3h139.2V133H14.9z"
|
|
}), /*#__PURE__*/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)"
|
|
}), /*#__PURE__*/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)"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
d: "M0 0v168l168 .69V0zm111.3 124.1s-3.4-4.1-6.3-7.7c12.6-3.5 17.4-11.3 17.4-11.3a52.52 52.52 0 01-11.1 5.6 68.63 68.63 0 01-38.9 4 70.12 70.12 0 01-14.1-4.1 48.88 48.88 0 01-7.1-3.3c-.3-.2-.6-.3-.9-.5a.76.76 0 00-.4-.2c-1.7-1-2.6-1.6-2.6-1.6s4.6 7.6 16.8 11.2c-2.9 3.6-6.4 7.9-6.4 7.9-21.2-.6-29.3-14.5-29.3-14.5 0-30.6 13.8-55.4 13.8-55.4 13.8-10.3 26.9-10 26.9-10l1 1.1C52.8 50.3 45 57.9 45 57.9a56.2 56.2 0 015.7-2.7 72.19 72.19 0 0121.8-6 8.75 8.75 0 011.6-.2 89.1 89.1 0 0119.4-.2 78.45 78.45 0 0128.9 9.1s-7.5-7.2-23.9-12.1l1.3-1.5s13.1-.3 26.9 10c0 0 13.8 24.8 13.8 55.4.1-.1-8 13.8-29.2 14.4z",
|
|
fill: "url(#prefix__c)"
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/AccountInfos.jsx":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/AccountInfos.jsx ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_AccountInfos; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
|
|
|
|
/**
|
|
* @type {typeof import("react")}
|
|
*/
|
|
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
|
|
let marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
|
|
let colorModule = BDModules.get(e => e.colorStandard)[0];
|
|
let sizeModule = BDModules.get(e => e.size32)[0];
|
|
let scrollbarModule1 = BDModules.get(e => e.scrollbarGhostHairline)[0];
|
|
const GuildModule = BDModules.get(e => e.default && e.default.getGuilds)[0].default;
|
|
const relationShipModule = BDModules.get(e => e.default && e.default.getRelationships)[0].default;
|
|
const sessionModule = BDModules.get(e => e.default && e.default.getSessions)[0].default;
|
|
const userModule = BDModules.get(e => e.default && e.default.getCurrentUser)[0].default;
|
|
class V2C_AccountInfos extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
if (!marginModule2) marginModule2 = BDModules.get(e => e.defaultMarginh5)[0];
|
|
if (!colorModule) colorModule = BDModules.get(e => e.colorStandard)[0];
|
|
if (!sizeModule) sizeModule = BDModules.get(e => e.size32)[0];
|
|
return [/*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "Account Infos"
|
|
}), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, "Profile"), /*#__PURE__*/React.createElement(CodeContent, {
|
|
content: this.getProfileValue(),
|
|
language: "diff"
|
|
}), /*#__PURE__*/React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, "Statistics"), /*#__PURE__*/React.createElement(CodeContent, {
|
|
content: this.getStatistics(),
|
|
language: "diff"
|
|
}), /*#__PURE__*/React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, "Connected Sessions"), /*#__PURE__*/React.createElement(CodeContent, {
|
|
content: this.getSessionValue(),
|
|
language: "diff"
|
|
})), /*#__PURE__*/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}
|
|
+ Activities: ${e.activities.length}`;
|
|
}).join("\n" + "-".repeat(38) + "\n");
|
|
}
|
|
|
|
getProfileValue() {
|
|
const user = userModule.getCurrentUser();
|
|
/**
|
|
* @type {Date}
|
|
*/
|
|
|
|
const createdAt = user.createdAt;
|
|
let avatarURL = user.avatarURL;
|
|
|
|
if (user.avatar && user.avatar.startsWith("a_")) {
|
|
avatarURL = user.getAvatarURL("gif");
|
|
}
|
|
|
|
if (avatarURL.startsWith("/")) {
|
|
avatarURL = "https://discord.com" + avatarURL;
|
|
}
|
|
|
|
if (avatarURL.endsWith("?size=128")) {
|
|
avatarURL = avatarURL.replace("?size=128", "?size=4096");
|
|
}
|
|
|
|
return `+ Username: ${user.username}
|
|
+ Discriminator: ${user.discriminator}
|
|
+ Tag: ${user.tag}
|
|
+ ID: ${user.id}
|
|
+ Avatar: ${user.avatar}
|
|
+ Avatar URL: ${avatarURL}
|
|
+ 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 /*#__PURE__*/React.createElement("div", {
|
|
class: `${messageModule1.markup} ${messageModule2.messageContent}`
|
|
}, /*#__PURE__*/React.createElement("pre", null, /*#__PURE__*/React.createElement("code", {
|
|
class: `${scrollbarModule1.scrollbarGhostHairline} hljs`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: hightlightJS.highlight(this.props.language, this.props.content).value
|
|
}
|
|
})), /*#__PURE__*/React.createElement("div", {
|
|
className: BDModules.get(e => e.marginBottom8)[0].marginBottom8
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/ApiPreview.jsx":
|
|
/*!*******************************!*\
|
|
!*** ./src/ui/ApiPreview.jsx ***!
|
|
\*******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ApiPreview; });
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ "fs");
|
|
/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__);
|
|
/* harmony import */ var _modules_distant__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/distant */ "./src/modules/distant.js");
|
|
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_3__);
|
|
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
|
|
// Good luck to read my code, Even me can't read it properly.
|
|
|
|
|
|
|
|
|
|
|
|
let formModule;
|
|
class ApiPreview extends React.PureComponent {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.state = {
|
|
states: []
|
|
};
|
|
}
|
|
|
|
render() {
|
|
if (!formModule) formModule = _modules_webpackModules__WEBPACK_IMPORTED_MODULE_2__["default"].find(e => e.FormSection);
|
|
/**
|
|
* @type {Function[]}
|
|
*/
|
|
|
|
const allComponents = [...new Set(Object.keys(window.Lightcord.Api.Components).map(e => {
|
|
return Object.keys(window.Lightcord.Api.Components[e]).map(k => window.Lightcord.Api.Components[e][k]);
|
|
}).flat())];
|
|
return [/*#__PURE__*/React.createElement(formModule.FormSection, {
|
|
tag: "h2",
|
|
title: "Lightcord's Api Availlable components"
|
|
}, /*#__PURE__*/React.createElement(formModule.FormText, {
|
|
type: "description",
|
|
className: "",
|
|
selectable: false
|
|
}, "These components are here for the plugin devs. They can quickly embed any component below with this panel.", /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
marginTop: "20px"
|
|
}
|
|
}), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, {
|
|
type: "info"
|
|
}, "All these components have error handling. If you want none, add `.original` after the component path."), /*#__PURE__*/React.createElement(Lightcord.Api.Components.general.AlertBox, {
|
|
type: "warn"
|
|
}, "We do not recommend modifying these component with plugins. Only do this if you know what you are doing.")), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_4__["default"], null), /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
color: "brand",
|
|
look: "outlined",
|
|
size: "medium",
|
|
hoverColor: "green",
|
|
onClick: () => {
|
|
electron__WEBPACK_IMPORTED_MODULE_3__["remote"].shell.openExternal("https://lightcord.deroku.xyz/LightcordApi/docs");
|
|
},
|
|
wrapper: false
|
|
}, "Documentation")), allComponents.map(comp => {
|
|
const compName = comp.displayName || comp.name;
|
|
const compPath = `Lightcord.Api.Components.${Object.keys(window.Lightcord.Api.Components).find(e => window.Lightcord.Api.Components[e][compName])}.${compName}`;
|
|
return /*#__PURE__*/React.createElement(ComponentPreview, {
|
|
key: compPath,
|
|
comp: comp
|
|
});
|
|
})];
|
|
}
|
|
|
|
get renders() {}
|
|
|
|
}
|
|
|
|
class ComponentPreview extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
tab: "preview",
|
|
elem: props.comp,
|
|
options: {}
|
|
};
|
|
}
|
|
|
|
render() {
|
|
const comp = this.props.comp;
|
|
let AllPreviews = [];
|
|
if (comp.AllPreviews) AllPreviews = comp.AllPreviews;
|
|
let state = this.state;
|
|
|
|
let getProps = () => {
|
|
let final = {};
|
|
AllPreviews.forEach(category => {
|
|
final[Object.keys(category[0])[0]] = category[0][Object.keys(category[0])[0]];
|
|
});
|
|
Object.keys(state.options).forEach(key => {
|
|
final[key] = AllPreviews.find(e => e.find(e => e[key]))[state.options[key]][key];
|
|
});
|
|
return final;
|
|
};
|
|
|
|
let renderPreview = () => {
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
margin: "20px"
|
|
}
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
backgroundColor: "var(--background-secondary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
},
|
|
className: "lc-tab-box-shadow"
|
|
}, React.createElement(comp, getProps())));
|
|
};
|
|
|
|
let renderCode = () => {
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
margin: "20px"
|
|
}
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
backgroundColor: "var(--background-secondary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
},
|
|
className: "lc-tab-box-shadow"
|
|
}, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "JSX"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher, null, React.createElement(() => {
|
|
return /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
|
|
language: "jsx",
|
|
content: generateCode("jsx")
|
|
});
|
|
})), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, "React"), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.ErrorCatcher, null, React.createElement(() => {
|
|
return /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.CodeBlock, {
|
|
language: "js",
|
|
content: generateCode("react")
|
|
});
|
|
}))));
|
|
};
|
|
|
|
let getStrForProp = (value, compPath, lang) => {
|
|
if (typeof value === "string") {
|
|
return value;
|
|
} else if (typeof value === "boolean") {
|
|
return String(value);
|
|
} else if (typeof value === "function") {
|
|
return value.toString();
|
|
} else if (typeof value === "object") {
|
|
if (value && value.$$typeof && (value.$$typeof === Symbol.for("react.element") || value.$$typeof === 0xeac7)) {
|
|
if (compPath === "Lightcord.Api.Components.general.Tabs") {
|
|
if (lang === "react") {
|
|
return `React.createElement("div", {style: {
|
|
marginTop: "20px", marginBottom: "20px"
|
|
}},
|
|
React.createElement("div", {style: {
|
|
backgroundColor: "var(--background-secondary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
}, className: "lc-tab-box-shadow" },
|
|
React.createElement(Lightcord.Api.Components.general.Title, null, "Preview tabs")
|
|
)
|
|
)`;
|
|
} else if (lang === "jsx") {
|
|
return `<div style={{
|
|
marginTop: "20px", marginBottom: "20px"
|
|
}}>
|
|
<div style={{
|
|
backgroundColor: "var(--background-secondary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
}} className="lc-tab-box-shadow">
|
|
<Lightcord.Api.Components.general.Title>Preview tabs</Lightcord.Api.Components.general.Title>
|
|
</div>
|
|
</div>`;
|
|
}
|
|
}
|
|
|
|
return "Your components here.";
|
|
}
|
|
|
|
return JSON.stringify(value, null, " ");
|
|
} else if (typeof value === "number") {
|
|
return String(value);
|
|
}
|
|
|
|
return String(value);
|
|
};
|
|
|
|
let generateCode = function (lang) {
|
|
// code formatting is hard
|
|
const compName = comp.displayName || comp.name;
|
|
let categories = Object.keys(window.Lightcord.Api.Components);
|
|
const compCategory = categories.find(e => window.Lightcord.Api.Components[e][compName]);
|
|
const compPath = `Lightcord.Api.Components.${compCategory}.${compName}`;
|
|
const props = getProps();
|
|
|
|
if (lang === "jsx") {
|
|
let propStrings = [];
|
|
let childrenProp = null;
|
|
Object.keys(props).forEach(key => {
|
|
if (key == "children") {
|
|
childrenProp = getStrForProp(props[key], compPath, lang);
|
|
} else {
|
|
let str = key + "=";
|
|
|
|
if (typeof props[key] === "string") {
|
|
str += JSON.stringify(props[key]);
|
|
} else {
|
|
str += `{${getStrForProp(props[key], compPath, lang)}}`;
|
|
}
|
|
|
|
propStrings.push(str);
|
|
}
|
|
});
|
|
let openTag;
|
|
|
|
if (childrenProp) {
|
|
openTag = `<${compPath} ${propStrings.join(" ")}>`;
|
|
let closeTag = `</${compPath}>`;
|
|
return `${openTag}\n ${childrenProp}\n${closeTag}`;
|
|
} else {
|
|
openTag = `<${compPath} ${propStrings.join(" ")}/>`;
|
|
return openTag;
|
|
}
|
|
} else if (lang === "react") {
|
|
let children = props.children || null;
|
|
delete props.children;
|
|
|
|
if (children && children.$$typeof && (children.$$typeof === Symbol.for("react.element") || children.$$typeof === 0xeac7)) {
|
|
children = getStrForProp(children, compPath, lang);
|
|
}
|
|
|
|
let propStrings = [];
|
|
Object.keys(props).forEach(key => {
|
|
let visibleKey = /[^\w\d_]/g.test(key) ? JSON.stringify(key) : key;
|
|
let str = visibleKey + ": ";
|
|
|
|
if (typeof props[key] === "string") {
|
|
str += JSON.stringify(props[key]);
|
|
} else {
|
|
str += getStrForProp(props[key], compPath, lang).split("\n").map((str, i) => {
|
|
if (i === 0) return str;
|
|
return " " + str;
|
|
}).join("\n");
|
|
}
|
|
|
|
propStrings.push(str);
|
|
});
|
|
let propObject = "{";
|
|
|
|
if (propStrings.length) {
|
|
propStrings.forEach((str, i) => {
|
|
let isLast = i === propStrings.length - 1;
|
|
let isFirst = i === 0;
|
|
|
|
if (!isFirst) {
|
|
propObject += ",";
|
|
}
|
|
|
|
propObject += "\n ";
|
|
propObject += str;
|
|
|
|
if (isLast) {
|
|
propObject += "\n}";
|
|
}
|
|
});
|
|
} else {
|
|
propObject += "}";
|
|
}
|
|
|
|
let childrenData = typeof children === "string" && children.startsWith("React.createElement") ? children : JSON.stringify(children);
|
|
return `React.createElement(${compPath}, ${propObject}, ${childrenData})`;
|
|
}
|
|
};
|
|
|
|
let help = comp.help || {};
|
|
let info = help.info ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "info"
|
|
}, help.info) : null;
|
|
let warn = help.warn ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "warn"
|
|
}, help.warn) : null;
|
|
let danger = help.danger ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "danger"
|
|
}, help.danger) : null;
|
|
let error = help.error ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "error"
|
|
}, help.error) : null;
|
|
let success = help.success ? /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.AlertBox, {
|
|
type: "success"
|
|
}, help.success) : null;
|
|
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingsTitle, null, comp.displayName || comp.name), info, success, warn, error, danger, AllPreviews.map(category => {
|
|
if (category[0].onClick) return null;
|
|
if (category[0].text) return null;
|
|
if (category[0].children) return null;
|
|
if (category.length === 1) return null;
|
|
let key = Object.keys(category[0])[0];
|
|
return [/*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.SettingSubTitle, null, key), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
|
|
options: category.map((e, index) => {
|
|
return {
|
|
value: "opt-" + index,
|
|
label: JSON.stringify(e[Object.keys(e)[0]])
|
|
};
|
|
}),
|
|
value: "opt-" + (state.options[key] || "0"),
|
|
onChange: value => {
|
|
this.setState({
|
|
options: Object.assign({}, state.options, {
|
|
[key]: (value.value || "0").replace("opt-", "")
|
|
})
|
|
});
|
|
},
|
|
searchable: true
|
|
}), /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
marginBottom: "8px"
|
|
}
|
|
})];
|
|
}), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.general.Tabs, {
|
|
tabs: [{
|
|
label: "Preview",
|
|
id: "preview"
|
|
}, {
|
|
label: "Code",
|
|
id: "code"
|
|
}],
|
|
active: state.tab,
|
|
children: state.tab === "preview" ? renderPreview() : renderCode(),
|
|
onChange: tab => {
|
|
this.setState({
|
|
tab
|
|
});
|
|
}
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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) => {
|
|
if (!container) {
|
|
console.error(new Error(`Container is undefined.`));
|
|
return false;
|
|
}
|
|
|
|
const cTop = container.scrollTop;
|
|
const cBottom = cTop + container.clientHeight;
|
|
const eTop = element.offsetTop;
|
|
const eBottom = eTop + element.clientHeight;
|
|
return eTop < cTop || eBottom > cBottom;
|
|
};
|
|
|
|
const thisNode = this.refs.cardNode;
|
|
const container = thisNode.closest("div[class*=\"contentRegionScroller-\"]");
|
|
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 /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_9__["default"], {
|
|
color: "black",
|
|
side: "top",
|
|
text: title
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-addon-button",
|
|
onClick: action
|
|
}, children));
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
this.unmounted = true;
|
|
}
|
|
|
|
get links() {
|
|
const links = [];
|
|
const addon = this.props.addon;
|
|
if (addon.website) links.push(this.makeLink("Website", addon.website));
|
|
if (addon.source) links.push(this.makeLink("Source", addon.source));
|
|
|
|
if (addon.invite) {
|
|
links.push(this.makeLink("Support Server", () => {
|
|
const tester = /\.gg\/(.*)$/;
|
|
let code = addon.invite;
|
|
if (tester.test(code)) code = code.match(tester)[1];
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].LayerStack.popLayer();
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].InviteActions.acceptInviteAndTransitionToInviteChannel(code);
|
|
}));
|
|
}
|
|
|
|
if (addon.donate) links.push(this.makeLink("Donate", addon.donate));
|
|
if (addon.patreon) links.push(this.makeLink("Patreon", addon.patreon));
|
|
return links;
|
|
}
|
|
|
|
get footer() {
|
|
const links = this.links;
|
|
return (links.length || this.hasSettings) && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card-footer bda-footer"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("span", {
|
|
className: "bd-addon-links bda-links"
|
|
}, ...links.map((element, index) => index < links.length - 1 ? [element, " | "] : element).flat()), this.hasSettings && _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
|
|
onClick: this.showSettings,
|
|
className: "bd-button bda-settings-button",
|
|
disabled: !this.state.checked
|
|
}, "Settings"));
|
|
}
|
|
|
|
onChange() {
|
|
this.props.toggle && this.props.toggle(this.name);
|
|
this.setState({
|
|
checked: !this.state.checked
|
|
});
|
|
}
|
|
|
|
edit() {
|
|
this.props.edit(this.name);
|
|
}
|
|
|
|
delete() {
|
|
this.props.remove(this.name);
|
|
}
|
|
|
|
reload() {
|
|
this.props.reload(this.name);
|
|
}
|
|
|
|
get name() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getName() : this.props.addon.name);
|
|
}
|
|
|
|
get author() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getAuthor() : this.props.addon.author);
|
|
}
|
|
|
|
get description() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getDescription() : this.props.addon.description);
|
|
}
|
|
|
|
get version() {
|
|
return this.getString(this.props.addon.plugin ? this.props.addon.plugin.getVersion() : this.props.addon.version);
|
|
}
|
|
|
|
render() {
|
|
if (this.state.settings) return this.settingsComponent;
|
|
const {
|
|
authorId,
|
|
authorLink
|
|
} = this.props.addon;
|
|
const style = {};
|
|
|
|
if (_0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"]["fork-ps-6"]) {
|
|
if (!this.isScanning) {
|
|
this.isScanning = true;
|
|
Object(_modules_pluginCertifier__WEBPACK_IMPORTED_MODULE_10__["processFile"])(Object(path__WEBPACK_IMPORTED_MODULE_12__["resolve"])(this.props.addon.filename.endsWith(".plugin.js") ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_11__["default"].themesFolder, this.props.addon.filename), result => {
|
|
if (this.unmounted) return;
|
|
this.setState({
|
|
isTrusted: result.suspect ? "suspect" : true
|
|
});
|
|
}, () => {});
|
|
} else {
|
|
if (this.state.isTrusted === true) {
|
|
style.borderColor = "#4087ed";
|
|
}
|
|
|
|
if (this.state.isTrusted === "suspect") {
|
|
style.borderColor = "rgb(240, 71, 71)";
|
|
}
|
|
}
|
|
}
|
|
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card bd-addon-card settings-closed ui-switch-item",
|
|
style
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-addon-header bda-header"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-card-title bda-header-title"
|
|
}, this.buildTitle(this.name, this.version, {
|
|
name: this.author,
|
|
id: authorId,
|
|
link: authorLink
|
|
})), _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("div", {
|
|
className: "bd-addon-controls bda-controls"
|
|
}, this.props.edit && this.makeButton("Edit", /*#__PURE__*/React.createElement(_icons_edit__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
className: "bd-icon"
|
|
}), this.edit), this.props.remove && this.makeButton("Delete", /*#__PURE__*/React.createElement(_icons_delete__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
|
className: "bd-icon"
|
|
}), this.delete), this.props.reload && this.makeButton("Reload", /*#__PURE__*/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 _reloadIcon__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./reloadIcon */ "./src/ui/reloadIcon.js");
|
|
/* harmony import */ var _addoncard__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./addoncard */ "./src/ui/addoncard.jsx");
|
|
/* harmony import */ var _components_dropdown__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./components/dropdown */ "./src/ui/components/dropdown.jsx");
|
|
/* harmony import */ var _components_search__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./components/search */ "./src/ui/components/search.jsx");
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../modules/contentManager */ "./src/modules/contentManager.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../modules/pluginModule */ "./src/modules/pluginModule.js");
|
|
/* harmony import */ var _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../modules/themeModule */ "./src/modules/themeModule.js");
|
|
/* harmony import */ var _modules_webpackModules__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../modules/webpackModules */ "./src/modules/webpackModules.js");
|
|
/* harmony import */ var _modules_bdApi__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../modules/bdApi */ "./src/modules/bdApi.js");
|
|
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _tooltipWrap__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./tooltipWrap */ "./src/ui/tooltipWrap.js");
|
|
/* harmony import */ var _modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../modules/bdEvents */ "./src/modules/bdEvents.js");
|
|
/* harmony import */ var _tooltip__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./tooltip */ "./src/ui/tooltip.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_11__["default"].findByDisplayName("Tooltip");
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_8__["default"].react;
|
|
class CardList extends _modules_v2__WEBPACK_IMPORTED_MODULE_8__["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_6__["pluginCookie"] : _0globals__WEBPACK_IMPORTED_MODULE_6__["themeCookie"];
|
|
this.manager = this.isPlugins ? _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"] : _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"];
|
|
this.sort = this.sort.bind(this);
|
|
this.reverse = this.reverse.bind(this);
|
|
this.search = this.search.bind(this);
|
|
|
|
this.onAddonChanges = function () {
|
|
this.forceUpdate();
|
|
};
|
|
|
|
this.onAddonChanges = this.onAddonChanges.bind(this);
|
|
}
|
|
|
|
componentDidMount() {
|
|
const type = (this.isPlugins ? "plugin" : "theme") + "-";
|
|
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}loaded`, this.onAddonChanges);
|
|
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}unloaded`, this.onAddonChanges);
|
|
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].on(`${type}reloaded`, this.onAddonChanges);
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
const type = (this.isPlugins ? "plugin" : "theme") + "-";
|
|
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}loaded`, this.onAddonChanges);
|
|
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}unloaded`, this.onAddonChanges);
|
|
_modules_bdEvents__WEBPACK_IMPORTED_MODULE_15__["default"].off(`${type}reloaded`, this.onAddonChanges);
|
|
}
|
|
|
|
openFolder() {
|
|
const shell = __webpack_require__(/*! electron */ "electron").shell;
|
|
|
|
const open = shell.openPath || shell.openItem;
|
|
open(this.isPlugins ? _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["default"].pluginsFolder : _modules_contentManager__WEBPACK_IMPORTED_MODULE_7__["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_12__["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: _0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-7"] ? this.edit.bind(this) : null,
|
|
remove: this.delete.bind(this),
|
|
addon: addon,
|
|
hash: addon.hash
|
|
};
|
|
}
|
|
|
|
getString(value) {
|
|
if (!value) return "???";
|
|
return typeof value == "string" ? value : value.toString();
|
|
}
|
|
|
|
get list() {
|
|
return this.props.type === "plugins" ? Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdplugins"]) : Object.values(_0globals__WEBPACK_IMPORTED_MODULE_6__["bdthemes"]);
|
|
}
|
|
|
|
getAddons() {
|
|
const sortedAddons = this.list.sort((a, b) => {
|
|
const cap = this.state.sort.charAt(0).toUpperCase() + this.state.sort.slice(1);
|
|
const first = a.plugin && a.plugin[`get${cap}`] ? this.getString(a.plugin[`get${cap}`]()) : this.getString(a[this.state.sort]);
|
|
const second = b.plugin && b.plugin[`get${cap}`] ? this.getString(b.plugin[`get${cap}`]()) : this.getString(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( /*#__PURE__*/React.createElement(_errorBoundary__WEBPACK_IMPORTED_MODULE_0__["default"], null, /*#__PURE__*/React.createElement(_addoncard__WEBPACK_IMPORTED_MODULE_3__["default"], _extends({}, props, {
|
|
reload: !_0globals__WEBPACK_IMPORTED_MODULE_6__["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);
|
|
}
|
|
|
|
renderCheckUpdates() {
|
|
if (!window.ZeresPluginLibrary) return null;
|
|
if (!window.PluginUpdates) return null;
|
|
if (typeof window.PluginUpdates.checkAll !== "function") return null;
|
|
if (!this.isPlugins) return null;
|
|
let tooltipIsShowing = false;
|
|
let tooltip;
|
|
return /*#__PURE__*/React.createElement(_tooltipWrap__WEBPACK_IMPORTED_MODULE_14__["default"], {
|
|
text: "Checks for updates of plugins that support this feature. Right-click for a list."
|
|
}, /*#__PURE__*/React.createElement("span", {
|
|
style: {
|
|
marginLeft: "10px"
|
|
},
|
|
onMouseLeave: () => {
|
|
tooltipIsShowing = false;
|
|
tooltip.hide();
|
|
}
|
|
}, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
ref: "checkUpdateButton",
|
|
color: "brand",
|
|
look: "filled",
|
|
size: "min",
|
|
hoverColor: "default",
|
|
onClick: () => {
|
|
try {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check in progress.", {
|
|
type: "info"
|
|
});
|
|
window.PluginUpdates.checkAll().then(() => {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("Plugin update check complete.", {
|
|
type: "success"
|
|
});
|
|
}).catch(err => {
|
|
console.error(err);
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", {
|
|
type: "error"
|
|
});
|
|
});
|
|
} catch (e) {
|
|
console.error(e);
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_13__["default"].showToast("An error occured while checking update.", {
|
|
type: "error"
|
|
});
|
|
}
|
|
},
|
|
wrapper: false,
|
|
disabled: false,
|
|
onRightClick: () => {
|
|
if (!this.refs.checkUpdateButton) return;
|
|
if (!window.PluginUpdates || !window.PluginUpdates.plugins) return;
|
|
if (tooltipIsShowing) return;
|
|
tooltip = new _tooltip__WEBPACK_IMPORTED_MODULE_16__["default"](this.refs.checkUpdateButton.refs.original.refs.button, Object.values(window.PluginUpdates.plugins).map(p => p.name).join(", "), {
|
|
side: "bottom",
|
|
attachEvents: false
|
|
});
|
|
tooltip.show();
|
|
tooltipIsShowing = true;
|
|
}
|
|
}, "Check for Updates")));
|
|
}
|
|
|
|
render() {
|
|
const refreshIcon = /*#__PURE__*/React.createElement(Tooltip, {
|
|
color: "black",
|
|
position: "top",
|
|
text: "Reload List"
|
|
}, props => /*#__PURE__*/React.createElement(_reloadIcon__WEBPACK_IMPORTED_MODULE_2__["default"], _extends({}, props, {
|
|
className: "bd-icon bd-reload bd-reload-header",
|
|
size: "18px",
|
|
onClick: async () => {
|
|
if (this.isPlugins) _modules_pluginModule__WEBPACK_IMPORTED_MODULE_9__["default"].updatePluginList();else _modules_themeModule__WEBPACK_IMPORTED_MODULE_10__["default"].updateThemeList();
|
|
this.forceUpdate();
|
|
}
|
|
})));
|
|
const addonCards = this.getAddons();
|
|
return /*#__PURE__*/React.createElement(_contentColumn__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
title: `${this.props.type.toUpperCase()}—${addonCards.length}`
|
|
}, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
key: "folder-button",
|
|
color: "brand",
|
|
look: "filled",
|
|
size: "min",
|
|
hoverColor: "default",
|
|
onClick: this.openFolder.bind(this),
|
|
wrapper: false,
|
|
style: {
|
|
marginLeft: "10px"
|
|
}
|
|
}, "Open ", this.isPlugins ? "Plugin" : "Theme", " Folder"), this.renderCheckUpdates(), !_0globals__WEBPACK_IMPORTED_MODULE_6__["settingsCookie"]["fork-ps-5"] && refreshIcon, /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-controls bd-addon-controls"
|
|
}, /*#__PURE__*/React.createElement(_components_search__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
onChange: this.search,
|
|
placeholder: `Search ${this.props.type}...`
|
|
}), /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-addon-dropdowns"
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-select-wrapper"
|
|
}, /*#__PURE__*/React.createElement("label", {
|
|
className: "bd-label"
|
|
}, "Sort by:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
options: this.sortOptions,
|
|
onChange: this.sort,
|
|
style: "transparent"
|
|
})), /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-select-wrapper"
|
|
}, /*#__PURE__*/React.createElement("label", {
|
|
className: "bd-label"
|
|
}, "Order:"), /*#__PURE__*/React.createElement(_components_dropdown__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
options: this.directions,
|
|
onChange: this.reverse,
|
|
style: "transparent"
|
|
})))), /*#__PURE__*/React.createElement("div", {
|
|
className: "bda-slist bd-addon-list"
|
|
}, addonCards));
|
|
}
|
|
|
|
}
|
|
const originalRender = CardList.prototype.render;
|
|
Object.defineProperty(CardList.prototype, "render", {
|
|
enumerable: false,
|
|
configurable: false,
|
|
set: function () {
|
|
console.warn("Addon policy for plugins #5 https://github.com/rauenzi/BetterDiscordApp/wiki/Addon-Policies#plugins");
|
|
},
|
|
get: () => originalRender
|
|
});
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/bdLogo.js":
|
|
/*!**************************!*\
|
|
!*** ./src/ui/bdLogo.js ***!
|
|
\**************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BDLogo; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class BDLogo extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
|
|
height: "100%",
|
|
width: this.props.size || "16px",
|
|
className: "bd-logo " + this.props.className,
|
|
style: {
|
|
fillRule: "evenodd",
|
|
clipRule: "evenodd",
|
|
strokeLinecap: "round",
|
|
strokeLinejoin: "round"
|
|
},
|
|
viewBox: "0 0 2000 2000"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("metadata", null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("defs", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
|
|
id: "shadow1"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
|
|
"dx": "20",
|
|
"dy": "0",
|
|
"stdDeviation": "20",
|
|
"flood-color": "rgba(0,0,0,0.35)"
|
|
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
|
|
id: "shadow2"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
|
|
"dx": "15",
|
|
"dy": "0",
|
|
"stdDeviation": "20",
|
|
"flood-color": "rgba(255,255,255,0.15)"
|
|
})), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("filter", {
|
|
id: "shadow3"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("feDropShadow", {
|
|
"dx": "10",
|
|
"dy": "0",
|
|
"stdDeviation": "20",
|
|
"flood-color": "rgba(0,0,0,0.35)"
|
|
}))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("g", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
style: {
|
|
filter: "url(#shadow3)"
|
|
},
|
|
d: "M1195.44+135.442L1195.44+135.442L997.6+136.442C1024.2+149.742+1170.34+163.542+1193.64+179.742C1264.34+228.842+1319.74+291.242+1358.24+365.042C1398.14+441.642+1419.74+530.642+1422.54+629.642L1422.54+630.842L1422.54+632.042C1422.54+773.142+1422.54+1228.14+1422.54+1369.14L1422.54+1370.34L1422.54+1371.54C1419.84+1470.54+1398.24+1559.54+1358.24+1636.14C1319.74+1709.94+1264.44+1772.34+1193.64+1821.44C1171.04+1837.14+1025.7+1850.54+1000+1863.54L1193.54+1864.54C1539.74+1866.44+1864.54+1693.34+1864.54+1296.64L1864.54+716.942C1866.44+312.442+1541.64+135.442+1195.44+135.442Z",
|
|
fill: "#171717",
|
|
opacity: "1"
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
style: {
|
|
filter: "url(#shadow2)"
|
|
},
|
|
d: "M1695.54+631.442C1685.84+278.042+1409.34+135.442+1052.94+135.442L361.74+136.442L803.74+490.442L1060.74+490.442C1335.24+490.442+1335.24+835.342+1060.74+835.342L1060.74+1164.84C1150.22+1164.84+1210.53+1201.48+1241.68+1250.87C1306.07+1353+1245.76+1509.64+1060.74+1509.64L361.74+1863.54L1052.94+1864.54C1409.24+1864.54+1685.74+1721.94+1695.54+1368.54C1695.54+1205.94+1651.04+1084.44+1572.64+999.942C1651.04+915.542+1695.54+794.042+1695.54+631.442Z",
|
|
fill: "#3E82E5",
|
|
opacity: "1"
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
style: {
|
|
filter: "url(#shadow1)"
|
|
},
|
|
d: "M1469.25+631.442C1459.55+278.042+1183.05+135.442+826.65+135.442L135.45+135.442L135.45+1004C135.45+1004+135.427+1255.21+355.626+1255.21C575.825+1255.21+575.848+1004+575.848+1004L577.45+490.442L834.45+490.442C1108.95+490.442+1108.95+835.342+834.45+835.342L664.65+835.342L664.65+1164.84L834.45+1164.84C923.932+1164.84+984.244+1201.48+1015.39+1250.87C1079.78+1353+1019.47+1509.64+834.45+1509.64L135.45+1509.64L135.45+1864.54L826.65+1864.54C1182.95+1864.54+1459.45+1721.94+1469.25+1368.54C1469.25+1205.94+1424.75+1084.44+1346.35+999.942C1424.75+915.542+1469.25+794.042+1469.25+631.442Z",
|
|
fill: "#FFFFFF",
|
|
opacity: "1"
|
|
})));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/checkbox.js":
|
|
/*!****************************!*\
|
|
!*** ./src/ui/checkbox.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Checkbox; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_Checkbox extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.onClick = this.onClick.bind(this);
|
|
this.setInitialState();
|
|
}
|
|
|
|
setInitialState() {
|
|
this.state = {
|
|
checked: this.props.checked || false
|
|
};
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("li", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "checkbox " + BDModules.get(e => e.checkboxElement)[0].checkbox,
|
|
onClick: this.onClick
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "checkbox-inner " + BDModules.get(e => e.checkboxInner)[0].checkboxInner
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
|
|
className: BDModules.get(e => e.checkboxElement)[0].checkboxElement,
|
|
checked: this.state.checked,
|
|
onChange: () => {},
|
|
type: "checkbox"
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, this.props.text)));
|
|
}
|
|
|
|
onClick() {
|
|
this.props.onChange(this.props.id, !this.state.checked);
|
|
this.setState({
|
|
checked: !this.state.checked
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/components/dropdown.jsx":
|
|
/*!****************************************!*\
|
|
!*** ./src/ui/components/dropdown.jsx ***!
|
|
\****************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return Select; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _icons_downarrow__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../icons/downarrow */ "./src/ui/icons/downarrow.jsx");
|
|
|
|
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
|
|
class Select extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
open: false,
|
|
value: this.props.value || this.props.options[0].value
|
|
};
|
|
this.dropdown = React.createRef();
|
|
this.onChange = this.onChange.bind(this);
|
|
this.showMenu = this.showMenu.bind(this);
|
|
this.hideMenu = this.hideMenu.bind(this);
|
|
}
|
|
|
|
showMenu(event) {
|
|
event.preventDefault();
|
|
this.setState({
|
|
open: true
|
|
}, () => {
|
|
document.addEventListener("click", this.hideMenu);
|
|
});
|
|
}
|
|
|
|
hideMenu() {
|
|
this.setState({
|
|
open: false
|
|
}, () => {
|
|
document.removeEventListener("click", this.hideMenu);
|
|
});
|
|
}
|
|
|
|
onChange(value) {
|
|
this.setState({
|
|
value
|
|
});
|
|
if (this.props.onChange) this.props.onChange(value);
|
|
}
|
|
|
|
get selected() {
|
|
return this.props.options.find(o => o.value == this.state.value);
|
|
}
|
|
|
|
get options() {
|
|
const selected = this.selected;
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-select-options"
|
|
}, this.props.options.map(opt => /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", {
|
|
className: `bd-select${style}${isOpen}`,
|
|
onClick: this.showMenu,
|
|
ref: this.dropdown
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: "bd-select-value"
|
|
}, this.selected.label), /*#__PURE__*/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 {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
focused: false
|
|
};
|
|
}
|
|
|
|
render() {
|
|
const className = ["bd-search-wrapper"];
|
|
if (this.state.focused) className.push("focused");
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
className: className.join(" ")
|
|
}, /*#__PURE__*/React.createElement("input", {
|
|
onChange: this.props.onChange,
|
|
onKeyDown: this.props.onKeyDown,
|
|
type: "text",
|
|
className: "bd-search",
|
|
placeholder: this.props.placeholder,
|
|
maxLength: "50",
|
|
onFocus: () => {
|
|
this.setState({
|
|
focused: true
|
|
});
|
|
},
|
|
onBlur: () => {
|
|
this.setState({
|
|
focused: false
|
|
});
|
|
}
|
|
}), /*#__PURE__*/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);
|
|
this.switch = /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Switch, {
|
|
onChange: this.onChange,
|
|
value: this.state.checked
|
|
});
|
|
}
|
|
|
|
onChange(value) {
|
|
if (this.props.disabled) return;
|
|
this.props.onChange(value);
|
|
this.setState({
|
|
checked: value
|
|
});
|
|
}
|
|
|
|
render() {
|
|
return this.switch;
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/contentColumn.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/contentColumn.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ContentColumn; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_ContentColumn extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
static get displayName() {
|
|
return "ContentColumn";
|
|
}
|
|
|
|
render() {
|
|
//let contentModule = BDModules.get(e => e.contentColumn)[0]
|
|
let title = this.props.title ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20"
|
|
}, this.props.title) : null;
|
|
return [title, this.props.children];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: contentModule.contentColumn + " " + contentModule.contentColumnDefault + " content-column default",
|
|
style: {
|
|
padding: "60px 40px 0px"
|
|
}
|
|
}, title, this.props.children);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/cssEditor.js":
|
|
/*!*****************************!*\
|
|
!*** ./src/ui/cssEditor.js ***!
|
|
\*****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_CssEditor; });
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_settingsPanel__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/settingsPanel */ "./src/modules/settingsPanel.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../modules/domtools */ "./src/modules/domtools.js");
|
|
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./checkbox */ "./src/ui/checkbox.js");
|
|
/* harmony import */ var _cssEditorDetached__WEBPACK_IMPORTED_MODULE_8__ = __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_8__["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/discord");
|
|
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 = Buffer.from(_ccss, "base64").toString("utf8");
|
|
}
|
|
|
|
return ccss;
|
|
}
|
|
|
|
updateLineCount() {
|
|
const lineCount = this.refs.editor.value.split("\n").length;
|
|
if (lineCount == this.props.lines) return;
|
|
this.refs.lines.textContent = Array.from(new Array(lineCount), (_, i) => i + 1).join(".\n") + ".";
|
|
this.props.lines = lineCount;
|
|
}
|
|
|
|
render() {
|
|
const self = this;
|
|
const {
|
|
detached
|
|
} = self.state;
|
|
return [detached && _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement("div", {
|
|
id: "editor-detached"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_2__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_6__["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_6__["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_7__["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", Buffer.from(this.editor.session.getValue(), "utf-8").toString("base64"));
|
|
}
|
|
|
|
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, ." + _modules_utils__WEBPACK_IMPORTED_MODULE_5__["default"].removeDa(BDModules.get(e => e.app && e.layers)[0].app));
|
|
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 _modules_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
|
|
/* harmony import */ var _checkbox__WEBPACK_IMPORTED_MODULE_6__ = __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/discord");
|
|
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 = Buffer.from(_ccss, "base64").toString("utf8");
|
|
}
|
|
|
|
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, ." + _modules_utils__WEBPACK_IMPORTED_MODULE_5__["default"].removeDa(BDModules.get(e => e.app && e.layers)[0].app));
|
|
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_6__["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", Buffer.from(this.editor.session.getValue(), "utf-8").toString("base64"));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./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 /*#__PURE__*/React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
fill: "var(--text-normal)",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
},
|
|
onClick: this.props.onClick
|
|
}, /*#__PURE__*/React.createElement("path", {
|
|
fill: "none",
|
|
d: "M0 0h24v24H0V0z"
|
|
}), /*#__PURE__*/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"
|
|
}), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
fill: "var(--text-normal)",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
}
|
|
}, /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
viewBox: "0 0 24 24",
|
|
fill: "var(--text-normal)",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
},
|
|
onClick: this.props.onClick
|
|
}, /*#__PURE__*/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"
|
|
}), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", {
|
|
viewBox: "0 0 24 24",
|
|
fill: "var(--text-normal)",
|
|
className: this.props.className || "",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
},
|
|
onClick: this.props.onClick
|
|
}, /*#__PURE__*/React.createElement("path", {
|
|
d: "M0 0h24v24H0z",
|
|
fill: "none"
|
|
}), /*#__PURE__*/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 /*#__PURE__*/React.createElement("svg", {
|
|
className: this.props.className || "",
|
|
fill: "var(--text-normal)",
|
|
viewBox: "0 0 24 24",
|
|
style: {
|
|
width: size,
|
|
height: size
|
|
}
|
|
}, /*#__PURE__*/React.createElement("path", {
|
|
fill: "none",
|
|
d: "M0 0h24v24H0V0z"
|
|
}), /*#__PURE__*/React.createElement("path", {
|
|
d: "M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/margintop.jsx":
|
|
/*!******************************!*\
|
|
!*** ./src/ui/margintop.jsx ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MarginTop; });
|
|
let marginModule = BDModules.get(e => e.marginTop60)[0];
|
|
class MarginTop extends React.Component {
|
|
render() {
|
|
if (!marginModule) marginModule = BDModules.get(e => e.marginTop60)[0];
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
className: marginModule.marginTop60
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/presenceSettings.jsx":
|
|
/*!*************************************!*\
|
|
!*** ./src/ui/presenceSettings.jsx ***!
|
|
\*************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PresenceSettings; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
|
|
/* harmony import */ var _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../modules/dataStore */ "./src/modules/dataStore.js");
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../modules/CustomRichPresence */ "./src/modules/CustomRichPresence.js");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! electron */ "electron");
|
|
/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_6__);
|
|
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
|
|
/* harmony import */ var _modules_utils__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../modules/utils */ "./src/modules/utils.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const React = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].React;
|
|
let V2C_PresenceSettingsModules;
|
|
class V2C_PresenceSettings extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.state = {
|
|
data: _modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].getSettingGroup("rpc") || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"],
|
|
assets: []
|
|
};
|
|
this.preview = null;
|
|
this.isfetching = false;
|
|
|
|
if (this.state.data.application_id) {
|
|
this.fetchAssets();
|
|
}
|
|
|
|
this.assetComponents = new Set();
|
|
}
|
|
|
|
updateWhenFetched(comp) {
|
|
this.assetComponents.add(comp);
|
|
}
|
|
/**
|
|
*
|
|
* @param {InputText} setting
|
|
*/
|
|
|
|
|
|
onChange(setting, value) {
|
|
let defaultSetting = RPCProps.find(e => e.id === setting.props.id);
|
|
this.setState({
|
|
data: Object.assign(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"], this.state.data, {
|
|
[defaultSetting.id]: !!value ? value : null
|
|
}),
|
|
assets: this.state.assets
|
|
});
|
|
|
|
if (setting.props.id === "application_id") {
|
|
this.fetchAssets();
|
|
}
|
|
|
|
_modules_dataStore__WEBPACK_IMPORTED_MODULE_3__["default"].setSettingGroup("rpc", _0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
|
|
this.preview.forceUpdate();
|
|
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].set(_0globals__WEBPACK_IMPORTED_MODULE_4__["settingsRPC"]);
|
|
}
|
|
|
|
fetchAssets() {
|
|
if (this.isfetching === true) {
|
|
let app = this.state.data.application_id;
|
|
setTimeout(() => {
|
|
if (this.state.data.application_id !== app) {
|
|
return;
|
|
}
|
|
|
|
this.fetchAssets();
|
|
}, 5000);
|
|
}
|
|
|
|
if (!this.state.data.application_id) {
|
|
this.setState({
|
|
data: this.state.data,
|
|
assets: []
|
|
});
|
|
this.forceUpdate();
|
|
this.assetComponents.forEach(e => e.forceUpdate());
|
|
return;
|
|
}
|
|
|
|
this.isfetching = true;
|
|
_modules_CustomRichPresence__WEBPACK_IMPORTED_MODULE_5__["default"].fetchAssets(this.state.data.application_id).then(assets => {
|
|
this.isfetching = false;
|
|
this.setState({
|
|
data: this.state.data,
|
|
assets: Object.keys(assets).map(k => {
|
|
let asset = assets[k];
|
|
return {
|
|
id: asset.id,
|
|
name: asset.name,
|
|
type: asset.type
|
|
};
|
|
})
|
|
});
|
|
this.forceUpdate();
|
|
this.assetComponents.forEach(e => e.forceUpdate());
|
|
}).catch(() => {
|
|
this.isfetching = false;
|
|
this.setState({
|
|
data: this.state.data,
|
|
assets: []
|
|
});
|
|
this.forceUpdate();
|
|
this.assetComponents.forEach(e => e.forceUpdate());
|
|
});
|
|
}
|
|
|
|
updatePreview(data) {
|
|
this.setState({
|
|
data
|
|
});
|
|
}
|
|
|
|
get modules() {
|
|
return V2C_PresenceSettingsModules || (V2C_PresenceSettingsModules = [BDModules.get(e => e.marginBottom20)[0]]);
|
|
}
|
|
|
|
render() {
|
|
let [marginModule] = this.modules;
|
|
return [/*#__PURE__*/React.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
title: "RichPresence Settings",
|
|
settings: this.props.settings,
|
|
onChange: this.props.onChange
|
|
}), /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_7__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "RichPresence"
|
|
}), /*#__PURE__*/React.createElement("div", null, this.optionsComponents), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_margintop__WEBPACK_IMPORTED_MODULE_7__["default"], null), /*#__PURE__*/React.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
text: "Preview"
|
|
}), /*#__PURE__*/React.createElement(RpcPreview, {
|
|
settings: this
|
|
})), /*#__PURE__*/React.createElement("div", {
|
|
className: marginModule.marginBottom20
|
|
}), /*#__PURE__*/React.createElement("button", {
|
|
style: {
|
|
opacity: 0.01
|
|
},
|
|
onClick: window.ohgodohfuck
|
|
}, "Oh god Oh fuck"), /*#__PURE__*/React.createElement("button", {
|
|
style: {
|
|
opacity: 0.01
|
|
},
|
|
onClick: () => {
|
|
electron__WEBPACK_IMPORTED_MODULE_6__["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 /*#__PURE__*/React.createElement(InputText, {
|
|
setting: e,
|
|
manager: this,
|
|
id: e.id
|
|
});
|
|
} else if (e.type === "number") {
|
|
let array = [/*#__PURE__*/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 /*#__PURE__*/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 = /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, /*#__PURE__*/React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, setting.title), this.input), /*#__PURE__*/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 = /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, /*#__PURE__*/React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, setting.title), this.input, setting.id === "timestamps.start" ? /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
onClick: () => {
|
|
DiscordNative.clipboard.copy(Date.now() + "");
|
|
},
|
|
color: "brand"
|
|
}, "Copy current timestamp") : null), /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, /*#__PURE__*/React.createElement("h5", {
|
|
className: colorModule.colorStandard + " " + sizeModule.size14 + " " + marginModule2.h5 + " " + marginModule2.defaultMarginh5
|
|
}, setting.title), /*#__PURE__*/React.createElement(window.Lightcord.Api.Components.inputs.Dropdown, {
|
|
value: this.state.data,
|
|
options: options,
|
|
onChange: this.onChange.bind(this)
|
|
})), /*#__PURE__*/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 /*#__PURE__*/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 /*#__PURE__*/React.createElement("div", {
|
|
className: rowModule.row + " " + marginModule.marginBottom20
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: `${rowModule.item} ${flexModule.flexChild}`
|
|
}, /*#__PURE__*/React.createElement(Lightcord.Api.Components.inputs.Button, {
|
|
onClick: this.props.onClick,
|
|
color: "brand"
|
|
}, this.props.title)));
|
|
}
|
|
|
|
}
|
|
|
|
class RpcPreview extends React.Component {
|
|
constructor(props = {}) {
|
|
super(props);
|
|
this.state = {
|
|
active: "profile"
|
|
};
|
|
this.tabs = [];
|
|
this.props.settings.preview = this;
|
|
}
|
|
|
|
changeTab(tab) {
|
|
let ancientTab = this.state.active;
|
|
if (ancientTab === tab.props.id) return;
|
|
this.tabs.forEach(e => {
|
|
e.setActive(false);
|
|
});
|
|
tab.setActive(true);
|
|
this.setState({
|
|
active: tab.props.id
|
|
});
|
|
}
|
|
|
|
render() {
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
className: "lc-tabWrapper"
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: "lc-tabnav",
|
|
style: {
|
|
flex: "0 1 auto"
|
|
}
|
|
}, /*#__PURE__*/React.createElement(Tab, {
|
|
preview: this,
|
|
title: "Full Profile",
|
|
id: "profile"
|
|
}), /*#__PURE__*/React.createElement(Tab, {
|
|
preview: this,
|
|
title: "User Popout",
|
|
id: "popout"
|
|
})), /*#__PURE__*/React.createElement(PresenceErrorCatcher, {
|
|
preview: this.preview,
|
|
state: this.state.rpc,
|
|
props: {
|
|
preview: this
|
|
},
|
|
key: this.state.active
|
|
}));
|
|
}
|
|
|
|
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 /*#__PURE__*/React.createElement("div", {
|
|
className: className,
|
|
onClick: () => {
|
|
this.props.preview.changeTab(this);
|
|
}
|
|
}, this.props.title);
|
|
}
|
|
|
|
}
|
|
|
|
let emptyClasses;
|
|
|
|
class PresenceErrorCatcher extends React.Component {
|
|
componentDidCatch(err, errInfo) {
|
|
console.error(err, errInfo);
|
|
this.setState({
|
|
error: true
|
|
});
|
|
}
|
|
|
|
render() {
|
|
if (!this.state) {
|
|
this.state = {
|
|
error: false
|
|
};
|
|
}
|
|
|
|
if (!this.state.error) {
|
|
try {
|
|
const preview = new this.props.preview(this.props.props);
|
|
preview.setState(this.props.state);
|
|
return preview.render();
|
|
} catch (err) {
|
|
console.error(err);
|
|
this.state.error = true;
|
|
return this.render();
|
|
}
|
|
} else {
|
|
emptyClasses = emptyClasses || _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.emptyStateImage && e.emptyState);
|
|
|
|
if (!emptyClasses) {
|
|
_modules_utils__WEBPACK_IMPORTED_MODULE_8__["default"].showToast("An error occured. Please check the console for more informations.");
|
|
return null;
|
|
}
|
|
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
margin: "20px"
|
|
}
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
style: {
|
|
backgroundColor: "var(--background-primary)",
|
|
padding: "30px 30px",
|
|
borderRadius: "8px"
|
|
},
|
|
className: `lc-tab-box-shadow ${emptyClasses.emptyState}`
|
|
}, /*#__PURE__*/React.createElement("div", {
|
|
className: emptyClasses.emptyStateImage,
|
|
style: {
|
|
marginTop: "20px"
|
|
}
|
|
}), /*#__PURE__*/React.createElement("div", {
|
|
className: emptyClasses.emptyStateHeader
|
|
}, "An error occured"), /*#__PURE__*/React.createElement("p", {
|
|
className: emptyClasses.emptyStateSubtext
|
|
}, "Please check the console for more informations. Join our \xAD", /*#__PURE__*/React.createElement("a", {
|
|
className: `${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchor} ${_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].anchorClasses.anchorUnderlineOnHover}`,
|
|
role: "button",
|
|
tabindex: 0,
|
|
onClick: () => {
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].joinLC();
|
|
}
|
|
}, "support server"), "\xAD for help.")));
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
let popoutModules;
|
|
let UserPopoutComponent;
|
|
let PopoutProps;
|
|
|
|
class Popout extends React.Component {
|
|
get modules() {
|
|
return popoutModules || (popoutModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "UserPopout"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]);
|
|
}
|
|
|
|
getComponent() {
|
|
let [UserPopout, userModule] = this.modules;
|
|
const user = userModule.default.getCurrentUser();
|
|
return React.createElement(() => {
|
|
let render1 = UserPopout.default({
|
|
userId: user.id,
|
|
guildId: null,
|
|
channelId: null,
|
|
disableUserProfileLink: true
|
|
});
|
|
UserPopoutComponent = render1.type;
|
|
PopoutProps = render1.props;
|
|
return this.render();
|
|
}, null);
|
|
}
|
|
|
|
render() {
|
|
if (!UserPopoutComponent) return this.getComponent();
|
|
let [_UserPopout, userModule] = this.modules;
|
|
const user = userModule.default.getCurrentUser();
|
|
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
|
|
|
|
const activity = function () {
|
|
if (!this.game) return null;
|
|
let game = {
|
|
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name,
|
|
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["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,
|
|
type: 0
|
|
};
|
|
return game;
|
|
}.call({
|
|
game: data
|
|
});
|
|
|
|
const popout = new UserPopoutComponent(Object.assign({}, PopoutProps, {
|
|
activity: activity,
|
|
userId: user.id
|
|
})).render().props.children; // bypass tracking
|
|
// remove the stop propagation shit.
|
|
|
|
const container = /*#__PURE__*/React.createElement("div", window.Lightcord.Api._.excludeProperties(popout.props, ["onClick", "onContextMenu"]));
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
className: "lc-userPopout lc-tab-box-shadow"
|
|
}, container);
|
|
}
|
|
|
|
}
|
|
|
|
let profileModules;
|
|
let UserProfileComponent;
|
|
let ProfileProps;
|
|
let connectedProfileStore;
|
|
|
|
class Profile extends React.Component {
|
|
get modules() {
|
|
return profileModules || (profileModules = [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.displayName === "UserProfile"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.find(e => e.default && e.default.getCurrentUser)]);
|
|
}
|
|
|
|
render() {
|
|
let [UserProfile, userModule] = this.modules;
|
|
const user = userModule.default.getCurrentUser();
|
|
|
|
if (!UserProfileComponent) {
|
|
const render1 = new UserProfile.default({
|
|
user: user
|
|
}).render();
|
|
connectedProfileStore = render1.type;
|
|
const render2 = new render1.type(render1.props).render();
|
|
const render3 = render2.type.render(render2.props, null);
|
|
const render4 = new render3.type(render3.props).render();
|
|
UserProfileComponent = render4.type;
|
|
}
|
|
|
|
if (!UserProfileComponent) throw new Error(`Couldn't find the UserProfileComponent component.`);
|
|
let data = Object.assign({}, _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"], this.props.preview.props.settings.state.data);
|
|
|
|
const activity = function () {
|
|
if (!this.game) return null;
|
|
let game = {
|
|
name: this.game.name || _0globals__WEBPACK_IMPORTED_MODULE_4__["defaultRPC"].name,
|
|
application_id: this.game.application_id || _0globals__WEBPACK_IMPORTED_MODULE_4__["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,
|
|
type: 0
|
|
};
|
|
return game;
|
|
}.call({
|
|
game: data
|
|
});
|
|
|
|
ProfileProps = new connectedProfileStore({
|
|
user: user,
|
|
close: () => {}
|
|
}).render().props;
|
|
const profile = new UserProfileComponent(Object.assign({}, ProfileProps, {
|
|
activity: activity
|
|
})).render().props.children; // bypass tracking
|
|
|
|
profile.props.style = {
|
|
width: "auto"
|
|
};
|
|
return /*#__PURE__*/React.createElement("div", {
|
|
className: "lc-tab lc-tab-box-shadow"
|
|
}, profile);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/layer.js":
|
|
/*!***************************************!*\
|
|
!*** ./src/ui/publicservers/layer.js ***!
|
|
\***************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Layer; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _modules_domtools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../modules/domtools */ "./src/modules/domtools.js");
|
|
|
|
|
|
class V2C_Layer extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.keyupListener = this.keyupListener.bind(this);
|
|
}
|
|
|
|
keyupListener(e) {
|
|
if (e.which === 27) {
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(this.refs.root.parentNode);
|
|
}
|
|
}
|
|
|
|
componentDidMount() {
|
|
window.addEventListener("keyup", this.keyupListener);
|
|
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
thisNode.style.transform = `scale(${1.1 - 0.1 * progress}) translateZ(0px)`;
|
|
thisNode.style.opacity = progress;
|
|
|
|
if (progress == 1) {
|
|
setImmediate(() => {
|
|
thisNode.style.transform = "";
|
|
thisNode.style.opacity = "";
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
componentWillUnmount() {
|
|
window.removeEventListener("keyup", this.keyupListener);
|
|
const thisNode = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(`#${this.props.id}`);
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
thisNode.style.transform = `scale(${1.1 - 0.1 * (1 - progress)}) translateZ(0px)`;
|
|
thisNode.style.opacity = 1 - progress;
|
|
|
|
if (progress == 1) {
|
|
setImmediate(() => {
|
|
thisNode.remove();
|
|
});
|
|
}
|
|
}
|
|
});
|
|
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query(".publicServersOpen");
|
|
layer.classList.remove("publicServersOpen");
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
layer.style.transform = `scale(${0.07 * progress + 0.93}) translateZ(0px)`;
|
|
layer.style.opacity = progress;
|
|
|
|
if (progress == 1) {
|
|
setImmediate(() => {
|
|
layer.style.transform = "";
|
|
layer.style.opacity = "";
|
|
});
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
componentWillMount() {
|
|
const layer = _modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].query("[class*=\"layer-\"]");
|
|
layer.classList.add("publicServersOpen");
|
|
_modules_domtools__WEBPACK_IMPORTED_MODULE_1__["default"].animate({
|
|
duration: 200,
|
|
update: function (progress) {
|
|
layer.style.transform = `scale(${0.07 * (1 - progress) + 0.93}) translateZ(0px)`;
|
|
layer.style.opacity = 1 - progress;
|
|
}
|
|
});
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "layer bd-layer " + BDModules.get(e => e.layer && e.animating)[0].layer,
|
|
id: this.props.id,
|
|
ref: "root",
|
|
style: {
|
|
opacity: 0,
|
|
transform: "scale(1.1) translateZ(0px)"
|
|
}
|
|
}, this.props.children);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/publicServers.js":
|
|
/*!***********************************************!*\
|
|
!*** ./src/ui/publicservers/publicServers.js ***!
|
|
\***********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_PublicServers; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _tools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools */ "./src/ui/tools.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../tabBarSeparator */ "./src/ui/tabBarSeparator.js");
|
|
/* harmony import */ var _tabBarHeader__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../tabBarHeader */ "./src/ui/tabBarHeader.js");
|
|
/* harmony import */ var _tabBarItem__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../tabBarItem */ "./src/ui/tabBarItem.js");
|
|
/* harmony import */ var _serverCard__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./serverCard */ "./src/ui/publicservers/serverCard.js");
|
|
/* harmony import */ var _sidebarView__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./sidebarView */ "./src/ui/publicservers/sidebarView.js");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class V2C_PublicServers extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
this.setInitialState();
|
|
this.close = this.close.bind(this);
|
|
this.changeCategory = this.changeCategory.bind(this);
|
|
this.search = this.search.bind(this);
|
|
this.searchKeyDown = this.searchKeyDown.bind(this);
|
|
this.checkConnection = this.checkConnection.bind(this);
|
|
this.join = this.join.bind(this);
|
|
this.connect = this.connect.bind(this);
|
|
this.GuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getGuilds"]);
|
|
this.AvatarDefaults = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getUserAvatarURL", "DEFAULT_AVATARS"]);
|
|
this.InviteActions = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["acceptInvite"]);
|
|
this.SortedGuildStore = _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].WebpackModules.findByUniqueProperties(["getSortedGuilds"]);
|
|
}
|
|
|
|
componentDidMount() {
|
|
this.checkConnection();
|
|
}
|
|
|
|
setInitialState() {
|
|
this.state = {
|
|
selectedCategory: -1,
|
|
title: "Loading...",
|
|
loading: true,
|
|
servers: [],
|
|
next: null,
|
|
connection: {
|
|
state: 0,
|
|
user: null
|
|
}
|
|
};
|
|
}
|
|
|
|
close() {
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactDom.unmountComponentAtNode(document.getElementById(this.props.rootId));
|
|
}
|
|
|
|
search(query, clear) {
|
|
const self = this;
|
|
fetch(`${self.endPoint}${query}${query ? "&schema=new" : "?schema=new"}`, {
|
|
method: "get"
|
|
}).then(async res => {
|
|
if (res.status !== 200) throw await res.text();
|
|
let data = await res.json();
|
|
let servers = data.results.reduce((arr, server) => {
|
|
server.joined = false;
|
|
arr.push(server); // arr.push(<ServerCard server={server} join={self.join}/>);
|
|
|
|
return arr;
|
|
}, []);
|
|
|
|
if (!clear) {
|
|
servers = self.state.servers.concat(servers);
|
|
} else {//servers.unshift(self.bdServer);
|
|
}
|
|
|
|
let end = data.size + data.from;
|
|
data.next = `?from=${end}`;
|
|
if (self.state.term) data.next += `&term=${self.state.term}`;
|
|
if (self.state.selectedCategory) data.next += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
|
|
|
if (end >= data.total) {
|
|
end = data.total;
|
|
data.next = null;
|
|
}
|
|
|
|
let title = `Showing 1-${end} of ${data.total} results in ${self.categoryButtons[self.state.selectedCategory]}`;
|
|
if (self.state.term) title += ` for ${self.state.term}`;
|
|
self.setState({
|
|
loading: false,
|
|
title: title,
|
|
servers: servers,
|
|
next: data.next
|
|
});
|
|
|
|
if (clear) {
|
|
//console.log(self);
|
|
self.refs.sbv.refs.contentScroller.scrollTop = 0;
|
|
}
|
|
}).catch(err => {
|
|
console.error(err);
|
|
return self.setState({
|
|
loading: false,
|
|
title: "Failed to load servers. Check console for details"
|
|
});
|
|
});
|
|
}
|
|
|
|
async join(serverCard) {
|
|
if (serverCard.props.pinned) return this.InviteActions.acceptInvite(serverCard.props.invite_code);
|
|
await fetch(`${this.joinEndPoint}/${serverCard.props.server.identifier}`, {
|
|
method: "GET",
|
|
credentials: "include",
|
|
mode: "cors",
|
|
headers: {
|
|
"Accept": "application/json",
|
|
"Content-Type": "application/json"
|
|
}
|
|
});
|
|
serverCard.setState({
|
|
joined: true
|
|
});
|
|
}
|
|
|
|
connect() {
|
|
const self = this;
|
|
const options = self.windowOptions;
|
|
options.x = Math.round(window.screenX + window.innerWidth / 2 - options.width / 2);
|
|
options.y = Math.round(window.screenY + window.innerHeight / 2 - options.height / 2);
|
|
self.joinWindow = new (window.require("electron").remote.BrowserWindow)(options);
|
|
const url = "https://auth.discordservers.com/connect?scopes=guilds.join&previousUrl=https://auth.discordservers.com/info";
|
|
self.joinWindow.webContents.on("did-navigate", (event, url) => {
|
|
if (url != "https://auth.discordservers.com/info") return;
|
|
self.joinWindow.close();
|
|
self.checkConnection();
|
|
});
|
|
self.joinWindow.loadURL(url);
|
|
}
|
|
|
|
get windowOptions() {
|
|
return {
|
|
width: 500,
|
|
height: 550,
|
|
backgroundColor: "#282b30",
|
|
show: true,
|
|
resizable: false,
|
|
maximizable: false,
|
|
minimizable: false,
|
|
alwaysOnTop: true,
|
|
frame: false,
|
|
center: false,
|
|
webPreferences: {
|
|
nodeIntegration: false
|
|
}
|
|
};
|
|
}
|
|
|
|
get bdServer() {
|
|
const server = {
|
|
name: "BetterDiscord",
|
|
online: "7500+",
|
|
members: "20000+",
|
|
categories: ["community", "programming", "support"],
|
|
description: "Official BetterDiscord server for support etc",
|
|
identifier: "86004744966914048",
|
|
iconUrl: "https://cdn.discordapp.com/icons/86004744966914048/292e7f6bfff2b71dfd13e508a859aedd.webp",
|
|
nativejoin: true,
|
|
invite_code: "0Tmfo5ZbORCRqbAd",
|
|
pinned: true
|
|
};
|
|
const server2 = {
|
|
name: "Lightcord",
|
|
online: "30+",
|
|
members: "50+",
|
|
categories: ["community", "programming", "support"],
|
|
description: "Official Lightcord server for support etc",
|
|
identifier: "86004744966914048",
|
|
iconUrl: "https://avatars3.githubusercontent.com/u/65690058?s=200&v=4",
|
|
nativejoin: true,
|
|
invite_code: "7eFff2A",
|
|
pinned: true
|
|
};
|
|
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
|
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
server: server2,
|
|
pinned: true,
|
|
join: this.join,
|
|
guildList: guildList,
|
|
fallback: defaultList[Math.floor(Math.random() * 5)]
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
server: server,
|
|
pinned: true,
|
|
join: this.join,
|
|
guildList: guildList,
|
|
fallback: defaultList[Math.floor(Math.random() * 5)]
|
|
})];
|
|
}
|
|
|
|
get endPoint() {
|
|
return "https://search.discordservers.com";
|
|
}
|
|
|
|
get joinEndPoint() {
|
|
return "https://j.discordservers.com";
|
|
}
|
|
|
|
get connectEndPoint() {
|
|
return "https://join.discordservers.com/connect";
|
|
}
|
|
|
|
async checkConnection() {
|
|
const self = this;
|
|
|
|
try {
|
|
const response = await fetch(`https://auth.discordservers.com/info`, {
|
|
method: "GET",
|
|
credentials: "include",
|
|
mode: "cors",
|
|
headers: {
|
|
"Accept": "application/json",
|
|
"Content-Type": "application/json"
|
|
}
|
|
});
|
|
const data = await response.json();
|
|
self.setState({
|
|
selectedCategory: 0,
|
|
connection: {
|
|
state: 2,
|
|
user: data
|
|
}
|
|
});
|
|
self.search("", true);
|
|
} catch (error) {
|
|
console.error(error);
|
|
self.setState({
|
|
title: "Not connected to discordservers.com!",
|
|
loading: true,
|
|
selectedCategory: -1,
|
|
connection: {
|
|
state: 1,
|
|
user: null
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_sidebarView__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
|
ref: "sbv"
|
|
}, this.component);
|
|
}
|
|
|
|
get component() {
|
|
return {
|
|
sidebar: {
|
|
component: this.sidebar
|
|
},
|
|
content: {
|
|
component: this.content
|
|
},
|
|
tools: {
|
|
component: _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tools__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
key: "pt",
|
|
ref: "tools",
|
|
onClick: this.close
|
|
})
|
|
}
|
|
};
|
|
}
|
|
|
|
get sidebar() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "sidebar",
|
|
key: "ps"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar SIDE"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar-header",
|
|
style: {
|
|
fontSize: "16px"
|
|
}
|
|
}, "Public Servers"), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.searchInput, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarHeader__WEBPACK_IMPORTED_MODULE_4__["default"], {
|
|
text: "Categories"
|
|
}), this.categoryButtons.map((value, index) => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarItem__WEBPACK_IMPORTED_MODULE_5__["default"], {
|
|
id: index,
|
|
onClick: this.changeCategory,
|
|
key: index,
|
|
text: value,
|
|
selected: this.state.selectedCategory === index
|
|
});
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), this.footer, this.connection));
|
|
}
|
|
|
|
get searchInput() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-form-item"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-text-input flex-vertical",
|
|
style: {
|
|
width: "172px",
|
|
marginLeft: "10px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("input", {
|
|
ref: "searchinput",
|
|
onKeyDown: this.searchKeyDown,
|
|
onChange: () => {},
|
|
type: "text",
|
|
className: "input default",
|
|
placeholder: "Search...",
|
|
maxLength: "50"
|
|
})));
|
|
}
|
|
|
|
searchKeyDown(e) {
|
|
const self = this;
|
|
if (self.state.loading || e.which !== 13) return;
|
|
self.setState({
|
|
loading: true,
|
|
title: "Loading...",
|
|
term: e.target.value
|
|
});
|
|
let query = `?term=${e.target.value}`;
|
|
|
|
if (self.state.selectedCategory !== 0) {
|
|
query += `&category=${self.categoryButtons[self.state.selectedCategory]}`;
|
|
}
|
|
|
|
self.search(query, true);
|
|
}
|
|
|
|
get categoryButtons() {
|
|
return ["All", "FPS Games", "MMO Games", "Strategy Games", "MOBA Games", "RPG Games", "Tabletop Games", "Sandbox Games", "Simulation Games", "Music", "Community", "Language", "Programming", "Other"];
|
|
}
|
|
|
|
changeCategory(id) {
|
|
const self = this;
|
|
if (self.state.loading) return;
|
|
self.refs.searchinput.value = "";
|
|
self.setState({
|
|
loading: true,
|
|
selectedCategory: id,
|
|
title: "Loading...",
|
|
term: null
|
|
});
|
|
|
|
if (id === 0) {
|
|
self.search("", true);
|
|
return;
|
|
}
|
|
|
|
self.search(`?category=${self.categoryButtons[id]}`, true);
|
|
}
|
|
|
|
get content() {
|
|
const self = this;
|
|
const guildList = this.SortedGuildStore.getFlattenedGuildIds();
|
|
const defaultList = this.AvatarDefaults.DEFAULT_AVATARS;
|
|
if (self.state.connection.state === 1) return self.notConnected;
|
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
ref: "content",
|
|
key: "pc",
|
|
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: self.state.title
|
|
}), self.bdServer, self.state.servers.map(server => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_serverCard__WEBPACK_IMPORTED_MODULE_6__["default"], {
|
|
key: server.identifier,
|
|
server: server,
|
|
join: self.join,
|
|
guildList: guildList,
|
|
fallback: defaultList[Math.floor(Math.random() * 5)]
|
|
});
|
|
}), self.state.next && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
onClick: () => {
|
|
if (self.state.loading) return;
|
|
self.setState({
|
|
loading: true
|
|
});
|
|
self.search(self.state.next, false);
|
|
},
|
|
className: "ui-button filled brand small grow",
|
|
style: {
|
|
width: "100%",
|
|
marginTop: "10px",
|
|
marginBottom: "10px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, self.state.loading ? "Loading" : "Load More")), self.state.servers.length > 0 && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: self.state.title
|
|
}))];
|
|
}
|
|
|
|
get notConnected() {
|
|
const self = this; //return BDV2.react.createElement(SettingsTitle, { text: self.state.title });
|
|
|
|
let columnModule = BDModules.get(e => e.contentColumnDefault)[0];
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
key: "ncc",
|
|
ref: "content",
|
|
className: columnModule.contentColumn + " " + columnModule.contentColumn + " content-column default"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20"
|
|
}, "Not connected to discordservers.com!", _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
onClick: self.connect,
|
|
type: "button",
|
|
className: "ui-button filled brand small grow",
|
|
style: {
|
|
display: "inline-block",
|
|
minHeight: "18px",
|
|
marginLeft: "10px",
|
|
lineHeight: "14px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Connect"))), self.bdServer)];
|
|
}
|
|
|
|
get footer() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-tab-bar-header"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("a", {
|
|
href: "https://discordservers.com",
|
|
target: "_blank"
|
|
}, "Discordservers.com"));
|
|
}
|
|
|
|
get connection() {
|
|
const self = this;
|
|
const {
|
|
connection
|
|
} = self.state;
|
|
if (connection.state !== 2) return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null);
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_tabBarSeparator__WEBPACK_IMPORTED_MODULE_3__["default"], null), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("span", {
|
|
style: {
|
|
color: "#b9bbbe",
|
|
fontSize: "10px",
|
|
marginLeft: "10px"
|
|
}
|
|
}, "Connected as: ", `${connection.user.username}#${connection.user.discriminator}`), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
style: {
|
|
padding: "5px 10px 0 10px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
style: {
|
|
width: "100%",
|
|
minHeight: "20px"
|
|
},
|
|
type: "button",
|
|
className: "ui-button filled brand small grow"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents",
|
|
onClick: self.connect
|
|
}, "Reconnect"))));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/serverCard.js":
|
|
/*!********************************************!*\
|
|
!*** ./src/ui/publicservers/serverCard.js ***!
|
|
\********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ServerCard; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_ServerCard extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
if (!this.props.server.iconUrl) this.props.server.iconUrl = this.props.fallback;
|
|
this.state = {
|
|
imageError: false,
|
|
joined: this.props.guildList.includes(this.props.server.identifier)
|
|
};
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
server
|
|
} = this.props;
|
|
let cardModule = BDModules.get(e => e.card && e.cardPrimary)[0];
|
|
let flexModule = BDModules.get(e => e.flexChild && e._horizontalReverse)[0];
|
|
let wrapModule = BDModules.get(e => e.noWrap && !e.streamerModeEnabled)[0];
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", // cardPrimary-1Hv-to
|
|
{
|
|
className: `${cardModule.card} ${cardModule.cardPrimary} ${BDModules.get(e => e.marginBottom8)[0].marginBottom8} bd-server-card${server.pinned ? " bd-server-card-pinned" : ""}`
|
|
}, // BDV2.react.createElement(
|
|
// "div",
|
|
// { className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY flex-1O1GKY directionRow-3v3tfG justifyStart-2yIZo0 alignStretch-1hwxMa noWrap-3jynv6" },
|
|
_modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("img", {
|
|
ref: "img",
|
|
className: "bd-server-image",
|
|
src: server.iconUrl,
|
|
onError: this.handleError.bind(this),
|
|
draggable: false
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: flexModule.flexChild + " bd-server-content"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: flexModule.horizontal + " " + wrapModule.noWrap + " bd-server-header"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
|
|
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-name"
|
|
}, server.name), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h5", {
|
|
className: "h5-18_1nd defaultColor-1_ajX0 margin-reset bd-server-member-count"
|
|
}, server.members, " Members")), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: flexModule.horizontal + " " + wrapModule.noWrap
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y bd-server-description-container"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scroller-2FKFPG scroller bd-server-description"
|
|
}, server.description))), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "flex-1xMQg5 flex-1O1GKY horizontal-1ae9ci horizontal-2EEEnY directionRow-3v3tfG noWrap-3jynv6 bd-server-footer"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "flexChild-faoVW3 bd-server-tags",
|
|
style: {
|
|
flex: "1 1 auto"
|
|
}
|
|
}, server.categories.join(", ")), this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN colorGreen-29iAKY",
|
|
style: {
|
|
minHeight: "12px",
|
|
marginTop: "4px",
|
|
backgroundColor: "#3ac15c"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Joined")), server.error && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN disabled-9aF2ug",
|
|
style: {
|
|
minHeight: "12px",
|
|
marginTop: "4px",
|
|
backgroundColor: "#c13a3a"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Error")), !server.error && !this.state.joined && _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("button", {
|
|
type: "button",
|
|
className: "button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeMin-1mJd1x grow-q77ONN",
|
|
style: {
|
|
minHeight: "12px",
|
|
marginTop: "4px"
|
|
},
|
|
onClick: () => {
|
|
this.join();
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "ui-button-contents"
|
|
}, "Join")))) // )
|
|
);
|
|
}
|
|
|
|
handleError() {
|
|
this.props.server.iconUrl = this.props.fallback;
|
|
this.setState({
|
|
imageError: true
|
|
});
|
|
}
|
|
|
|
join() {
|
|
this.props.join(this); //this.setState({joined: true});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/publicservers/sidebarView.js":
|
|
/*!*********************************************!*\
|
|
!*** ./src/ui/publicservers/sidebarView.js ***!
|
|
\*********************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SidebarView; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _scroller__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scroller */ "./src/ui/scroller.js");
|
|
|
|
|
|
class V2C_SidebarView extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
sidebar,
|
|
content,
|
|
tools
|
|
} = this.props.children;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "standardSidebarView-3F1I7i ui-standard-sidebar-view"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "sidebarRegion-VFTUkN sidebar-region"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_scroller__WEBPACK_IMPORTED_MODULE_1__["default"], {
|
|
key: "sidebarScroller",
|
|
ref: "sidebarScroller",
|
|
sidebar: true,
|
|
fade: sidebar.fade || true,
|
|
dark: sidebar.dark || true
|
|
}, sidebar.component)), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "contentRegion-3nDuYy content-region"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "contentTransitionWrap-3hqOEW content-transition-wrap"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scrollerWrap-2lJEkd firefoxFixScrollFlex-cnI2ix contentRegionScrollerWrap-3YZXdm content-region-scroller-wrap scrollerThemed-2oenus themeGhost-28MSn0 scrollerTrack-1ZIpsv"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "scroller-2FKFPG firefoxFixScrollFlex-cnI2ix contentRegionScroller-26nc1e content-region-scroller scroller",
|
|
ref: "contentScroller"
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
className: "contentColumn-2hrIYH contentColumnDefault-1VQkGM content-column default"
|
|
}, content.component), tools.component)))));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/reloadIcon.js":
|
|
/*!******************************!*\
|
|
!*** ./src/ui/reloadIcon.js ***!
|
|
\******************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_ReloadIcon; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_ReloadIcon extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("svg", {
|
|
xmlns: "http://www.w3.org/2000/svg",
|
|
viewBox: "0 0 24 24",
|
|
fill: "#dcddde",
|
|
className: "bd-reload " + this.props.className,
|
|
onClick: this.props.onClick,
|
|
style: {
|
|
width: this.props.size || "24px",
|
|
height: this.props.size || "24px"
|
|
}
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z"
|
|
}), _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("path", {
|
|
fill: "none",
|
|
d: "M0 0h24v24H0z"
|
|
}));
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/scroller.js":
|
|
/*!****************************!*\
|
|
!*** ./src/ui/scroller.js ***!
|
|
\****************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_Scroller; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_Scroller extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
//scrollerWrap-2lJEkd scrollerThemed-2oenus themeGhostHairline-DBD-2d scrollerFade-1Ijw5y
|
|
let scrollerModule1 = BDModules.get(e => e.scrollerHorizontal)[0];
|
|
let scrollerModule2 = BDModules.get(e => e.sidebarRegionScroller)[0];
|
|
let wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhostHairline}${this.props.fade ? " " + scrollerModule1.scrollerFade : ""}`;
|
|
let scrollerClass = scrollerModule1.scroller + " scroller";
|
|
/* fuck */
|
|
|
|
if (this.props.sidebar) scrollerClass += ` ${scrollerModule2.sidebarRegionScroller} sidebar-region-scroller`;
|
|
|
|
if (this.props.contentColumn) {
|
|
scrollerClass += " " + scrollerModule2.contentRegionScroller + " content-region-scroller";
|
|
/* fuck */
|
|
|
|
wrapperClass = `${scrollerModule1.scrollerWrap} ${scrollerModule2.contentRegionScrollerWrap} content-region-scroller-wrap ${scrollerModule1.scrollerThemed} ${scrollerModule1.themeGhost} ${scrollerModule1.scrollerTrack}`;
|
|
}
|
|
|
|
const {
|
|
children
|
|
} = this.props;
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
key: "scrollerwrap",
|
|
className: wrapperClass
|
|
}, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("div", {
|
|
key: "scroller",
|
|
ref: "scroller",
|
|
className: scrollerClass
|
|
}, children));
|
|
}
|
|
|
|
}
|
|
const originalRender = V2C_Scroller.prototype.render;
|
|
Object.defineProperty(V2C_Scroller.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/sectionedSettingsPanel.js":
|
|
/*!******************************************!*\
|
|
!*** ./src/ui/sectionedSettingsPanel.js ***!
|
|
\******************************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SectionedSettingsPanel; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsGroup__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./settingsGroup */ "./src/ui/settingsGroup.js");
|
|
/* harmony import */ var _margintop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./margintop */ "./src/ui/margintop.jsx");
|
|
|
|
|
|
|
|
class V2C_SectionedSettingsPanel extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
return this.props.sections.map((section, i) => {
|
|
return [i !== 0 ? _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_margintop__WEBPACK_IMPORTED_MODULE_2__["default"], {}) : null, _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement(_settingsGroup__WEBPACK_IMPORTED_MODULE_1__["default"], Object.assign({}, section, {
|
|
onChange: this.props.onChange
|
|
}))];
|
|
});
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/settingsGroup.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/settingsGroup.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsGroup; });
|
|
/* harmony import */ var _0globals__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../0globals */ "./src/0globals.js");
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _settingsTitle__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./settingsTitle */ "./src/ui/settingsTitle.js");
|
|
/* harmony import */ var _switch__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./switch */ "./src/ui/switch.js");
|
|
|
|
|
|
|
|
|
|
class V2C_SettingsGroup extends _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
}
|
|
|
|
render() {
|
|
const {
|
|
title,
|
|
settings,
|
|
button
|
|
} = this.props;
|
|
const buttonComponent = button ? _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement("button", {
|
|
key: "title-button",
|
|
className: "bd-pfbtn",
|
|
onClick: button.onClick
|
|
}, button.title) : null;
|
|
return [_modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_settingsTitle__WEBPACK_IMPORTED_MODULE_2__["default"], {
|
|
text: title
|
|
}), buttonComponent, settings.map(setting => {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_1__["default"].react.createElement(_switch__WEBPACK_IMPORTED_MODULE_3__["default"], {
|
|
id: setting.id,
|
|
key: setting.id,
|
|
data: setting,
|
|
checked: _0globals__WEBPACK_IMPORTED_MODULE_0__["settingsCookie"][setting.id],
|
|
onChange: (id, checked) => {
|
|
this.props.onChange(id, checked);
|
|
}
|
|
});
|
|
})];
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/settingsTitle.js":
|
|
/*!*********************************!*\
|
|
!*** ./src/ui/settingsTitle.js ***!
|
|
\*********************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return V2C_SettingsTitle; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
|
|
class V2C_SettingsTitle extends _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].reactComponent {
|
|
constructor(props) {
|
|
super(props);
|
|
} //h2-2gWE-o title-3sZWYQ size16-14cGz5 height20-mO2eIN weightSemiBold-NJexzi da-h2 da-title da-size16 da-height20 da-weightSemiBold defaultColor-1_ajX0 da-defaultColor marginTop60-3PGbtK da-marginTop60 marginBottom20-32qID7 da-marginBottom20
|
|
|
|
|
|
render() {
|
|
return _modules_v2__WEBPACK_IMPORTED_MODULE_0__["default"].react.createElement("h2", {
|
|
className: "ui-form-title h2 margin-reset margin-bottom-20"
|
|
}, this.props.text);
|
|
}
|
|
|
|
}
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./src/ui/switch.js":
|
|
/*!**************************!*\
|
|
!*** ./src/ui/switch.js ***!
|
|
\**************************/
|
|
/*! exports provided: default */
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
"use strict";
|
|
__webpack_require__.r(__webpack_exports__);
|
|
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return SwitchItem; });
|
|
/* harmony import */ var _modules_v2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../modules/v2 */ "./src/modules/v2.js");
|
|
/* harmony import */ var _components_switch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./components/switch */ "./src/ui/components/switch.jsx");
|
|
|
|
|
|
let classnames = [];
|
|
|
|
function getClassName(name) {
|
|
let className = classnames.find(e => e.startsWith(name + "-"));
|
|
if (className) return className;
|
|
className = BDModules.get(e => e[name])[0][name];
|
|
classnames.push(className);
|
|
return className;
|
|
}
|
|
|
|
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() {
|
|
let {
|
|
text,
|
|
info
|
|
} = this.props.data;
|
|
|
|
if (!classnames.find(e => e.startsWith("beta-"))) {
|
|
classnames.push(BDModules.get(e => e.beta && !e.container && !e.userSettingsVoice)[0].beta);
|
|
}
|
|
|
|
if (this.props.data.experimental) {
|
|
info = [info, React.createElement("sup", {
|
|
className: getClassName("beta")
|
|
}, "(EXPERIMENTAL)")];
|
|
}
|
|
|
|
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", {
|
|
key: "title",
|
|
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"], {
|
|
key: "switch",
|
|
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/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
|
|
*/
|
|
|
|
|
|
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`;
|
|
};
|
|
|
|
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
|
|
* @param {boolean} [options.attachEvents=true] - whether the tooltip should listen to mouseenter and mouseleave events.
|
|
*/
|
|
constructor(node, text, options = {}) {
|
|
const {
|
|
style = "black",
|
|
side = "top",
|
|
preventFlip = false,
|
|
disabled = false,
|
|
attachEvents = true
|
|
} = 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);
|
|
|
|
if (attachEvents) {
|
|
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("." + _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(BDModules.get(e => e.popouts)[0].popouts) + " ~ ." + _modules_utils__WEBPACK_IMPORTED_MODULE_0__["default"].removeDa(BDModules.get(e => e.layerContainer)[0].layerContainer));
|
|
}
|
|
/** 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 React.Component {
|
|
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");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "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");
|
|
|
|
/***/ })
|
|
|
|
/******/ });
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvMGdsb2JhbHMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9pbmRleC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL2xvYWRpbmdJY29uLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbG9jYWxTdG9yYWdlRml4LmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy8yNGhvdXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL0FudGlBZERNLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9DdXN0b21SaWNoUHJlc2VuY2UuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2JkQXBpLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9iZEV2ZW50cy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvYmx1clByaXZhdGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NsYXNzTm9ybWFsaXplci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvY29sb3JlZFRleHQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2NvbnRlbnRNYW5hZ2VyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9jb3JlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9kYXRhU3RvcmUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rldk1vZGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc2FibGVUeXBpbmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2Rpc3RhbnQuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL2RvbXRvb2xzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9lbW9qaU1vZHVsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy9wbHVnaW5Nb2R1bGUuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3BvcG91dFdpbmRvdy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcHVibGljU2VydmVycy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvc2V0dGluZ3NQYW5lbC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvc2V0dGluZ3NQYW5lbFNpZGViYXIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3RoZW1lTW9kdWxlLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvbW9kdWxlcy91dGlscy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvdjIuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9tb2R1bGVzL3ZvaWNlTW9kZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvd2VicGFja01vZHVsZXMuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvYnVnX2h1bnRlci5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy9zdmcvY2lyY3VzLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3N2Zy9saWdodGNvcmQuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvQWNjb3VudEluZm9zLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL0FwaVByZXZpZXcuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvYWRkb25jYXJkLmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2FkZG9ubGlzdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9iZExvZ28uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9jaGVja2JveC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2NvbXBvbmVudHMvZHJvcGRvd24uanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zZWFyY2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29tcG9uZW50cy9zd2l0Y2guanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvY29udGVudENvbHVtbi5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2Nzc0VkaXRvckRldGFjaGVkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvZXJyb3JCb3VuZGFyeS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL2RlbGV0ZS5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9kb3duYXJyb3cuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvaWNvbnMvZWRpdC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9pY29ucy9oaXN0b3J5LmpzeCIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL2ljb25zL3NlYXJjaC5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9tYXJnaW50b3AuanN4Iiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHJlc2VuY2VTZXR0aW5ncy5qc3giLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9wdWJsaWNzZXJ2ZXJzL2xheWVyLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9wdWJsaWNTZXJ2ZXJzLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9zZXJ2ZXJDYXJkLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvcHVibGljc2VydmVycy9zaWRlYmFyVmlldy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3JlbG9hZEljb24uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zY3JvbGxlci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3NlY3Rpb25lZFNldHRpbmdzUGFuZWwuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS9zZXR0aW5nc0dyb3VwLmpzIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvLi9zcmMvdWkvc2V0dGluZ3NUaXRsZS5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3N3aXRjaC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhckhlYWRlci5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3RhYkJhckl0ZW0uanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90YWJCYXJTZXBhcmF0b3IuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29scy5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3Rvb2x0aXAuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC8uL3NyYy91aS90b29sdGlwV3JhcC5qcyIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL3VpL3hTdmcuanMiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcImNyeXB0b1wiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJlbGVjdHJvblwiIiwid2VicGFjazovL0JldHRlckRpc2NvcmQvZXh0ZXJuYWwgXCJldmVudHNcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwiZnNcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwibW9kdWxlXCIiLCJ3ZWJwYWNrOi8vQmV0dGVyRGlzY29yZC9leHRlcm5hbCBcIm5vZGUtZmV0Y2hcIiIsIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkL2V4dGVybmFsIFwicGF0aFwiIl0sIm5hbWVzIjpbIm1pbmltdW1EaXNjb3JkVmVyc2lvbiIsImN1cnJlbnREaXNjb3JkVmVyc2lvbiIsIndpbmRvdyIsIkRpc2NvcmROYXRpdmUiLCJyZW1vdGVBcHAiLCJnZXRWZXJzaW9uIiwibWluU3VwcG9ydGVkVmVyc2lvbiIsImJiZFZlcnNpb24iLCJiYmRDaGFuZ2Vsb2ciLCJkZXNjcmlwdGlvbiIsImNoYW5nZXMiLCJ0aXRsZSIsInR5cGUiLCJpdGVtcyIsInNldHRpbmdzIiwiaWQiLCJpbmZvIiwiaW1wbGVtZW50ZWQiLCJoaWRkZW4iLCJjYXQiLCJjYXRlZ29yeSIsImV4cGVyaW1lbnRhbCIsInByb2Nlc3MiLCJwbGF0Zm9ybSIsImRlZmF1bHRDb29raWUiLCJzZXR0aW5nc0Nvb2tpZSIsInNldHRpbmdzUlBDIiwiZGVmYXVsdFJQQyIsIkRhdGUiLCJub3ciLCJiZHBsdWdpbkVycm9ycyIsImJkdGhlbWVFcnJvcnMiLCJiZENvbmZpZyIsIk9iamVjdCIsImNyZWF0ZSIsIkJldHRlckRpc2NvcmRDb25maWciLCJiZHRoZW1lcyIsImJkcGx1Z2lucyIsInBsdWdpbkNvb2tpZSIsInRoZW1lQ29va2llIiwibG9jYWxTdG9yYWdlRml4IiwibG9hZGluZ0ljb24iLCJkZXByZWNhdGVHbG9iYWwiLCJrZXkiLCJ2YWx1ZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0IiwiVXRpbHMiLCJ3YXJuIiwiZ2xvYmFsS2V5cyIsImtleXMiLCJHbG9iYWxzIiwiQkRWMiIsInBsdWdpbk1vZHVsZSIsInRoZW1lTW9kdWxlIiwiQkRFdmVudHMiLCJzZXR0aW5nc1BhbmVsIiwiRGF0YVN0b3JlIiwiQ29udGVudE1hbmFnZXIiLCJDbGFzc05vcm1hbGl6ZXIiLCJCZEFwaSIsIkNvcmUiLCJDb3JlV3JhcHBlciIsImNvbnN0cnVjdG9yIiwibWV0aG9kcyIsInNldENvbmZpZyIsInNldE1ldGhvZHMiLCJpbml0IiwidjJMb2FkZXIiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJjb250ZW50V2luZG93R2V0dGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiSFRNTElGcmFtZUVsZW1lbnQiLCJwcm90b3R5cGUiLCJjb250ZW50V2luZG93IiwiUmVmbGVjdCIsImFwcGx5IiwiYXJndW1lbnRzIiwiUHJveHkiLCJvYmoiLCJwcm9wIiwidW5kZWZpbmVkIiwidmFsIiwiYmluZCIsIndyaXRhYmxlIiwiY29uZmlndXJhYmxlIiwiRnVuY3Rpb24iLCJvT3BlbiIsIlhNTEh0dHBSZXF1ZXN0Iiwib3BlbiIsInVybCIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJURkhvdXIiLCJpbmplY3QyNEhvdXIiLCJjYW5jZWwyNEhvdXIiLCJ0d2VsdmVIb3VyIiwiUmVnRXhwIiwiY29udmVydCIsImRhdGEiLCJtYXRjaGVkIiwicmV0dXJuVmFsdWUiLCJtYXRjaCIsImxlbmd0aCIsInJlcGxhY2UiLCJwYWRTdGFydCIsInBhcnNlSW50IiwiY2FuY2VsQ296eSIsIm1vbmtleVBhdGNoIiwiVGltZUZvcm1hdHRlciIsImFmdGVyIiwiY2FuY2VsQ29tcGFjdCIsInJlbW92ZTI0SG91ciIsImRpc3BhdGNoZXIiLCJMaWdodGNvcmQiLCJEaXNjb3JkTW9kdWxlcyIsIkNoYW5uZWxNb2R1bGUiLCJCRE1vZHVsZXMiLCJlIiwiZGVmYXVsdCIsImdldENoYW5uZWwiLCJoYXNDaGFubmVsIiwicmVsYXRpb25TaGlwTW9kdWxlIiwiYWRkUmVsYXRpb25zaGlwIiwiRE1Nb2R1bGUiLCJjbG9zZVByaXZhdGVDaGFubmVsIiwiYmxvY2tlZCIsInVzZXJNb2R1bGUiLCJnZXRDdXJyZW50VXNlciIsIkFudGlCb3RETSIsImFudGlETSIsImVuYWJsZWQiLCJlbmFibGUiLCJzdWJzY3JpYmUiLCJkaXNhYmxlIiwidW5zdWJzY3JpYmUiLCJldiIsIm1lc3NhZ2UiLCJhdXRob3IiLCJib3QiLCJndWlsZF9pZCIsImNoYW5uZWwiLCJjaGFubmVsX2lkIiwic2Nhbk1lc3NhZ2UiLCJzaG93VG9hc3QiLCJ1c2VybmFtZSIsImRpc2NyaW1pbmF0b3IiLCJsb2NhdGlvbiIsInRlc3QiLCJjb250ZW50IiwiRW1iZWRzQ29udGFpbnMiLCJzZWFyY2giLCJlbWJlZHMiLCJtYXAiLCJlbWJlZCIsImZvb3RlciIsInRleHQiLCJmaWVsZHMiLCJuYW1lIiwibSIsIkRpc3BhdGNoZXIiLCJkaXNwYXRjaCIsIkFjdGlvblR5cGVzIiwic29ja2V0SWQiLCJwaWQiLCJDdXN0b21SaWNoUHJlc2VuY2UiLCJnYW1lIiwiZm9ybWF0ZWRHYW1lIiwiYXBwbGljYXRpb25faWQiLCJkZXRhaWxzIiwic3RhdGUiLCJ0aW1lc3RhbXBzIiwic3RhcnQiLCJhc3NldHMiLCJsYXJnZV9pbWFnZSIsInNtYWxsX2ltYWdlIiwic2VuZEdhbWUiLCJMT0NBTF9BQ1RJVklUWV9VUERBVEUiLCJhY3Rpdml0eSIsImNvbnNvbGUiLCJsb2ciLCJzZXQiLCJmZXRjaEFzc2V0cyIsImFwcGxpY2F0aW9uSWQiLCJnZXRBc3NldHMiLCJFcnJvciIsIlJlYWN0IiwiUmVhY3RET00iLCJSZWFjdERvbSIsIlJlYWN0Q29tcG9uZW50IiwiV2luZG93Q29uZmlnRmlsZSIsImVtb3RlcyIsInNjcmVlbldpZHRoIiwiTWF0aCIsIm1heCIsImRvY3VtZW50RWxlbWVudCIsImNsaWVudFdpZHRoIiwiaW5uZXJXaWR0aCIsInNjcmVlbkhlaWdodCIsImNsaWVudEhlaWdodCIsImlubmVySGVpZ2h0IiwiZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMiLCJnZXRXaW5kb3dQcmVmZXJlbmNlIiwic2V0V2luZG93UHJlZmVyZW5jZSIsImluamVjdENTUyIsImNzcyIsIkRPTSIsImFkZFN0eWxlIiwiZXNjYXBlSUQiLCJjbGVhckNTUyIsInJlbW92ZVN0eWxlIiwibGlua0pTIiwiYWRkU2NyaXB0IiwidW5saW5rSlMiLCJyZW1vdmVTY3JpcHQiLCJnZXRQbHVnaW4iLCJoYXNPd25Qcm9wZXJ0eSIsInBsdWdpbiIsImdldENvcmUiLCJtYWluQ29yZSIsImFsZXJ0Iiwic2hvd0NvbmZpcm1hdGlvbk1vZGFsIiwiY2FuY2VsVGV4dCIsIm9wdGlvbnMiLCJmaW5kTW9kdWxlIiwiZmlsdGVyIiwiV2VicGFja01vZHVsZXMiLCJmaW5kIiwiZmluZEFsbE1vZHVsZXMiLCJmaW5kQWxsIiwiZmluZE1vZHVsZUJ5UHJvcHMiLCJwcm9wcyIsImZpbmRCeVVuaXF1ZVByb3BlcnRpZXMiLCJmaW5kTW9kdWxlQnlQcm90b3R5cGVzIiwicHJvdG9zIiwiZmluZEJ5UHJvdG90eXBlcyIsImZpbmRNb2R1bGVCeURpc3BsYXlOYW1lIiwiZmluZEJ5RGlzcGxheU5hbWUiLCJnZXRJbnRlcm5hbEluc3RhbmNlIiwibm9kZSIsImpRdWVyeSIsIkVsZW1lbnQiLCJsb2FkRGF0YSIsInBsdWdpbk5hbWUiLCJnZXRQbHVnaW5EYXRhIiwiZ2V0RGF0YSIsInNhdmVEYXRhIiwic2V0UGx1Z2luRGF0YSIsInNldERhdGEiLCJkZWxldGVEYXRhIiwiZGVsZXRlUGx1Z2luRGF0YSIsIndoYXQiLCJtZXRob2ROYW1lIiwib25SZW1vdmVkIiwiY2FsbGJhY2siLCJzdXBwcmVzc0Vycm9ycyIsIm1ldGhvZCIsInRlc3RKU09OIiwiaXNQbHVnaW5FbmFibGVkIiwiaXNUaGVtZUVuYWJsZWQiLCJpc1NldHRpbmdFbmFibGVkIiwiZW5hYmxlU2V0dGluZyIsIm9uQ2hhbmdlIiwiZGlzYWJsZVNldHRpbmciLCJ0b2dnbGVTZXR0aW5nIiwiZ2V0QkREYXRhIiwic2V0QkREYXRhIiwibWFrZUFkZG9uQVBJIiwiY29va2llIiwibGlzdCIsIm1hbmFnZXIiLCJBZGRvbkFQSSIsImZvbGRlciIsImlzRW5hYmxlZCIsInRvZ2dsZSIsInJlbG9hZCIsImdldEFsbCIsImsiLCJhIiwiUGx1Z2lucyIsIlRoZW1lcyIsIkJldHRlckRpc2NvcmQiLCJFdmVudEVtaXR0ZXIiLCJyZXF1aXJlIiwiZXZlbnROYW1lIiwiYXJncyIsImVtaXQiLCJvZmYiLCJldmVudEFjdGlvbiIsInJlbW92ZUxpc3RlbmVyIiwic2VsZWN0b3JzIiwicmVtb3ZlRGEiLCJnZXRTZWxlY3RvcnMiLCJzdGFuZGFyZFNpZGViYXJWaWV3IiwiZGVmYXVsdENsYXNzTmFtZSIsInNlbGVjdHMiLCJ1c2VyU2V0dGluZ3NBY2NvdW50IiwiY2hpbGRyZW4iLCJwdXNoIiwicGF5bWVudFNvdXJjZVJvdyIsInN1YlRleHQiLCJkZXNjcmlwdGlvbldyYXBwZXIiLCJ2aWV3Qm9keSIsInVzZXJTZXR0aW5nc1NlY3VyaXR5IiwiQmx1clByaXZhdGUiLCJlcnJvciIsIkRPTVRvb2xzIiwiam9pbiIsIm5vcm1hbGl6ZWRQcmVmaXgiLCJyYW5kQ2xhc3MiLCJzdG9wIiwiaGFzUGF0Y2hlZCIsInVucGF0Y2hDbGFzc01vZHVsZXMiLCJtb2R1bGVGaWx0ZXIiLCJyZXZlcnRFbGVtZW50IiwicXVlcnlTZWxlY3RvciIsInBhdGNoQ2xhc3NNb2R1bGVzIiwibm9ybWFsaXplRWxlbWVudCIsInBhdGNoRE9NTWV0aG9kcyIsIm1vZHVsZXMiLCJtb2R1bGUiLCJwYXRjaENsYXNzTW9kdWxlIiwidW5wYXRjaENsYXNzTW9kdWxlIiwic2hvdWxkSWdub3JlIiwiaXNOYU4iLCJlbmRzV2l0aCIsInN0YXJ0c1dpdGgiLCJBcnJheSIsImlzQXJyYXkiLCJfX2VzTW9kdWxlIiwiYmFzZUNsYXNzTmFtZSIsInNwbGl0IiwiY29tcG9uZW50TmFtZSIsImNsYXNzTmFtZXMiLCJjbGFzc0xpc3QiLCJub3JtYWxDbGFzcyIsImNhbWVsQ2FzZSIsInMiLCJpIiwidG9VcHBlckNhc2UiLCJzbGljZSIsIm5ld1N0cmluZyIsInRyaW0iLCJlbGVtZW50IiwiY2xhc3NlcyIsImMiLCJjbGVuIiwibmV3Q2xhc3MiLCJhZGQiLCJjaGlsZCIsIm5leHRFbGVtZW50U2libGluZyIsInRvUmVtb3ZlIiwicmVtb3ZlIiwiY29udGFpbnMiLCJET01Ub2tlbkxpc3QiLCJ0b2tlbiIsInRva2VucyIsInQiLCJDb2xvcmVkVGV4dCIsImluamVjdENvbG9yZWRUZXh0IiwiY2FuY2VsQ29sb3JlZFRleHQiLCJNZXNzYWdlQ29tcG9uZW50IiwiYmVmb3JlIiwibWV0aG9kQXJndW1lbnRzIiwiY2hpbGRyZW5NZXNzYWdlQ29udGVudCIsIm1lc3NhZ2VDb250ZW50IiwiZGlzcGxheU5hbWUiLCJvcmlnaW5hbFR5cGUiLCJfX29yaWdpbmFsTWV0aG9kIiwicm9sZUNvbG9yIiwiY29sb3JTdHJpbmciLCJzdHlsZSIsImNvbG9yIiwiYXNzaWduIiwicmVtb3ZlQ29sb3JlZFRleHQiLCJjbGFzc05hbWVNYXJrdXAiLCJtYXJrdXAiLCJxdWVyeVNlbGVjdG9yQWxsIiwiZm9yRWFjaCIsImVsZW0iLCJzZXRQcm9wZXJ0eSIsInBhdGgiLCJmcyIsIk1vZHVsZSIsImdsb2JhbFBhdGhzIiwicmVzb2x2ZSIsInJlbW90ZSIsImFwcCIsImdldEFwcFBhdGgiLCJNZXRhRXJyb3IiLCJvcmlnaW5hbEpTUmVxdWlyZSIsIl9leHRlbnNpb25zIiwib3JpZ2luYWxDU1NSZXF1aXJlIiwic3BsaXRSZWdleCIsImVzY2FwZWRBdFJlZ2V4IiwiYWRkb25DYWNoZSIsInRpbWVDYWNoZSIsIndhdGNoZXJzIiwicGF0Y2hFeHRlbnNpb25zIiwiZ2V0Q29udGVudFJlcXVpcmUiLCJwbHVnaW5zRm9sZGVyIiwiX3BsdWdpbnNGb2xkZXIiLCJyZWFscGF0aFN5bmMiLCJkYXRhUGF0aCIsInRoZW1lc0ZvbGRlciIsIl90aGVtZXNGb2xkZXIiLCJsb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSIsImRhdGFTdG9yZSIsImdldFNldHRpbmdHcm91cCIsInNldFNldHRpbmdHcm91cCIsImVuY3J5cHRTZXR0aW5nc0NhY2hlIiwiSlNPTiIsInBhcnNlIiwiZGVjcnlwdFNldHRpbmdzQ2FjaGUiLCJoYXNoIiwicmVzdWx0Iiwic3VzcGVjdCIsInNhdmVBZGRvbkNhY2hlIiwic3RyaW5naWZ5Iiwid2F0Y2hDb250ZW50IiwiY29udGVudFR5cGUiLCJpc1BsdWdpbiIsImJhc2VGb2xkZXIiLCJmaWxlRW5kaW5nIiwid2F0Y2giLCJwZXJzaXN0ZW50IiwiZXZlbnRUeXBlIiwiZmlsZW5hbWUiLCJQcm9taXNlIiwiciIsInNldFRpbWVvdXQiLCJzdGF0U3luYyIsImVyciIsImNvZGUiLCJ1bmxvYWRQbHVnaW4iLCJ1bmxvYWRUaGVtZSIsImlzRmlsZSIsInN0YXRzIiwibXRpbWUiLCJnZXRUaW1lIiwibG9hZFBsdWdpbiIsImxvYWRUaGVtZSIsInJlbG9hZFBsdWdpbiIsInJlbG9hZFRoZW1lIiwidW53YXRjaENvbnRlbnQiLCJjbG9zZSIsImV4dHJhY3RNZXRhIiwiZmlyc3RMaW5lIiwiaGFzT2xkTWV0YSIsInBhcnNlT2xkTWV0YSIsImhhc05ld01ldGEiLCJwYXJzZU5ld01ldGEiLCJtZXRhIiwicmF3TWV0YSIsInN1YnN0cmluZyIsImxhc3RJbmRleE9mIiwiaW5kZXhPZiIsInBhcnNlZCIsImZvcm1hdCIsImJsb2NrIiwib3V0IiwiZmllbGQiLCJhY2N1bSIsImxpbmUiLCJjaGFyQXQiLCJsIiwic3Vic3RyIiwic2VsZiIsIm9yaWdpbmFsUmVxdWlyZSIsInBvc3NpYmxlUGF0aCIsImJhc2VuYW1lIiwiZXhpc3RzU3luYyIsInJlYWRGaWxlU3luYyIsInN0cmlwQk9NIiwiYWRkZWQiLCJhdGltZU1zIiwibW9kaWZpZWQiLCJtdGltZU1zIiwic2l6ZSIsIl9jb21waWxlIiwiZGlkRXhwb3J0IiwiaXNFbXB0eSIsImV4cG9ydHMiLCJtYWtlUGxhY2Vob2xkZXJQbHVnaW4iLCJnZXROYW1lIiwiZ2V0QXV0aG9yIiwiZ2V0RGVzY3JpcHRpb24iLCJzb3VyY2UiLCJ3ZWJzaXRlIiwibG9hZENvbnRlbnQiLCJwcm9jZXNzRmlsZSIsInRpbWVzdGFtcCIsImZpbGUiLCJoYXJtIiwic3RhY2siLCJ1bmxvYWRDb250ZW50IiwiY2FjaGUiLCJpc0xvYWRlZCIsInJlbG9hZENvbnRlbnQiLCJjYW50VW5sb2FkIiwibG9hZE5ld0NvbnRlbnQiLCJiYXNlZGlyIiwiZmlsZXMiLCJyZWFkZGlyU3luYyIsImNvbnRlbnRMaXN0IiwidmFsdWVzIiwicmVtb3ZlZCIsImYiLCJsb2FkQWxsQ29udGVudCIsImVycm9ycyIsImxvYWRQbHVnaW5zIiwibG9hZFRoZW1lcyIsImNvbmZpZyIsImhhc1N0YXJ0ZWQiLCJmbGF0IiwidmVyc2lvbiIsIkVEIiwiV2ViU29ja2V0IiwicGF0Y2hBdHRyaWJ1dGVzIiwiaW5pdFNldHRpbmdzIiwiY2hlY2tGb3JHdWlsZHMiLCJpbml0aWFsaXplIiwiaW5pdGlhbGl6ZVNldHRpbmdzIiwiY29udGVudE1hbmFnZXIiLCJCdWZmZXIiLCJmcm9tIiwidG9TdHJpbmciLCJhZGRFdmVudExpc3RlbmVyIiwiY2xpY2siLCJQbHVnaW5DZXJ0aWZpZXIiLCJnZXRFbGVtZW50c0J5Q2xhc3NOYW1lIiwiaW5pdE9ic2VydmVyIiwic2hvd0NvbnRlbnRFcnJvcnMiLCJwbHVnaW5zIiwidGhlbWVzIiwicHJldmlvdXNWZXJzaW9uIiwic2hvd0NoYW5nZWxvZ01vZGFsIiwiRW1vamlNb2R1bGUiLCJwYXRjaFNvY2lhbCIsInBhdGNoR3VpbGRQaWxscyIsInBhdGNoR3VpbGRMaXN0SXRlbXMiLCJwYXRjaEd1aWxkU2VwYXJhdG9yIiwicGF0Y2hNZXNzYWdlSGVhZGVyIiwicGF0Y2hNZW1iZXJMaXN0IiwicGF0Y2hBdHRhY2htZW50IiwiaGF2ZUluc3RhbGxlZERlZmF1bHQiLCJvbkNsb3NlIiwibG9nbyIsInRvcCIsImlubmVySFRNTCIsImF0dHJpYnNQYXRjaHMiLCJjYW5jZWxQYXRjaEF0dHJpYnV0ZXMiLCJ2MiIsIkFuY2hvciIsIkFwaSIsImVuc3VyZUV4cG9ydGVkIiwidGhlbiIsIkRpc2NvcmRUYWciLCJEaXNjb3JkVGFnQ29tcCIsInV1aWR2NCIsImJhZGdlRGl2IiwiZGlzcGxheSIsIm1hcmdpblRvcCIsInVzZXIiLCJUb29sdGlwV3JhcCIsInNpZGUiLCJocmVmIiwidGFyZ2V0IiwiQkRMb2dvIiwiTGlnaHRjb3JkTG9nbyIsImRpdiIsImFwcGx5QmFkZ2VzIiwidGltZXNDaGVja2VkIiwid3JhcHBlciIsImd1aWxkQ2xhc3NlcyIsImd1aWxkIiwibGlzdEl0ZW0iLCJibG9iIiwiYmxvYkNvbnRhaW5lciIsImRlZmVyTG9hZGVkIiwicmVhZHlTdGF0ZSIsImluamVjdEV4dGVybmFscyIsInNhdmVTZXR0aW5ncyIsImxvYWRTZXR0aW5ncyIsInNldHRpbmciLCJnZXRQcmVkaWNhdGVTZWN0aW9ucyIsInNldHRpbmdNb2R1bGUiLCJjYWxsIiwic2VjdGlvbiIsInBvcGVkIiwicG9wIiwicmVuZGVyU2lkZWJhciIsImNsYXNzTmFtZUxheWVyIiwiY2xhc3NOYW1lU29jaWFsTGlua3MiLCJjbGFzc05hbWVNb2RhbCIsIm1haW5PYnNlcnZlciIsIk11dGF0aW9uT2JzZXJ2ZXIiLCJtdXRhdGlvbnMiLCJtbGVuIiwibXV0YXRpb24iLCJyYXdPYnNlcnZlciIsImFkZGVkTm9kZXMiLCJsYXllciIsImFuaW1hdGluZyIsInNvY2lhbExpbmtzIiwibW9kYWwiLCJpbm5lciIsInJlc3BvbnNpdmVXaWR0aE1vYmlsZSIsImdldEF0dHJpYnV0ZSIsInNldEF0dHJpYnV0ZSIsInBhcmVudEVsZW1lbnQiLCJvYnNlcnZlIiwiY2hpbGRMaXN0Iiwic3VidHJlZSIsInNvY2lhbFBhdGNoIiwiVGFiQmFyIiwic29jaWFsTW9kdWxlMSIsIm9yaWdpbmFsIiwibmV3T25lIiwicmV0dXJuVmFsIiwibGluayIsImNsYXNzTmFtZUNvbG9yTXV0ZWQiLCJzaXplcyIsImNsYXNzTmFtZVZlcnNpb25IYXNoIiwiY29sb3JNdXRlZCIsInNpemUzMiIsInZlcnNpb25IYXNoIiwiYnJhbmNoIiwiYWRkaXRpb25hbCIsInJlYWN0Iiwic2l6ZTEyIiwiZWxlY3Ryb24iLCJnZXRHbG9iYWwiLCJjb21taXQiLCJvcmlnaW5hbFZlcnNpb25zIiwic3BsaWNlIiwiZ2V0R3VpbGRDbGFzc2VzIiwiZ3VpbGRzV3JhcHBlciIsImZpbmRCeVByb3BzIiwiZ3VpbGRzIiwicGlsbCIsImd1aWxkTGlzdEl0ZW1zUGF0Y2giLCJHdWlsZENsYXNzZXMiLCJsaXN0SXRlbUNsYXNzIiwiYmxvYkNsYXNzIiwicmVhY3RJbnN0YW5jZSIsIkd1aWxkQ29tcG9uZW50IiwicmV0dXJuIiwidGhpc09iamVjdCIsImd1aWxkRGF0YSIsInVucmVhZCIsInNlbGVjdGVkIiwiYXVkaW8iLCJ2aWRlbyIsImJhZGdlIiwiYW5pbWF0YWJsZSIsImd1aWxkUGlsbFBhdGNoIiwiZ3VpbGRQaWxsIiwiaG92ZXJlZCIsImd1aWxkU2VwYXJhdG9yUGF0Y2giLCJHdWlsZHMiLCJndWlsZENvbXBvbmVudHMiLCJHdWlsZFNlcGFyYXRvciIsIlNlcGFyYXRvciIsIkF0dGFjaG1lbnRQYXRjaCIsIkF0dGFjaG1lbnQiLCJhdHRhY2htZW50IiwiZ2V0TmVzdGVkUHJvcCIsInBhdGNoIiwibWVzc2FnZUhlYWRlclBhdGNoIiwiTWVzc2FnZUhlYWRlciIsImNoYXQiLCJuZXh0VGljayIsImdldEVsZW1lbnRCeUlkIiwiY2hpbGROb2RlcyIsImJsb2NrRGl2IiwiZGlzdGFudCIsImdldEJhZGdlcyIsImJhZGdlcyIsInN2ZyIsIndpZHRoIiwic2NvcGVzIiwic2NvcGUiLCJjb21wb25lbnQiLCJkaXYyIiwicmVhY3REb20iLCJyZW5kZXIiLCJtZW1iZXJMaXN0UGF0Y2giLCJNZW1iZXJMaXN0SXRlbSIsInJlbmRlckRlY29yYXRvcnMiLCJ1cGRhdGVJbmplY3RvciIsImluamVjdGlvblBhdGgiLCJfX25vbl93ZWJwYWNrX3JlcXVpcmVfXyIsInJlbGVhc2VDaGFubmVsIiwiZ2xvYmFscyIsImdldFJlbGVhc2VDaGFubmVsIiwiZW52IiwiQVBQREFUQSIsIkhPTUUiLCJYREdfQ09ORklHX0hPTUUiLCJzdGFibGUiLCJjYW5hcnkiLCJwdGIiLCJwbHVnaW5EYXRhIiwiQkRGaWxlIiwid3JpdGVGaWxlU3luYyIsInNldHRpbmdzRmlsZSIsInVubGlua1N5bmMiLCJfaW5qZWN0aW9uUGF0aCIsImJhc2UiLCJyb2FtaW5nQmFzZSIsImdldFBhdGgiLCJyb2FtaW5nTG9jYXRpb24iLCJyZWFsTG9jYXRpb24iLCJjb25maWdGaWxlIiwiX2NvbmZpZ0ZpbGUiLCJfQkRGaWxlIiwiX3NldHRpbmdzRmlsZSIsImdldFBsdWdpbkZpbGUiLCJEZXZNb2RlIiwiZGVidWdMaXN0ZW5lciIsImNvcHlTZWxlY3Rvckxpc3RlbmVyIiwic3RhcnREZWJ1Z0xpc3RlbmVyIiwic3RhcnRDb3B5U2VsZWN0b3IiLCJzdG9wRGVidWdMaXN0ZW5lciIsInN0b3BDb3B5U2VsZWN0b3IiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwid2hpY2giLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsInN0b3BQcm9wYWdhdGlvbiIsInNlbGVjdG9yIiwiZ2V0U2VsZWN0b3IiLCJjbGFzc0xheWVyIiwiY2xhc3NJdGVtcyIsImRpc2FibGVkUG9pbnRlckV2ZW50cyIsIm1lbnUiLCJhdHRhY2giLCJjbSIsInF1ZXJ5IiwiY29udGFpbmVyIiwibGF5ZXJDb250YWluZXIiLCJjbVdyYXAiLCJzdHlsZUZsZXhpYmxlIiwiYWNjb21tb2RhdGVTY3JvbGxiYXIiLCJhcHBlbmQiLCJjbGllbnRZIiwibGVmdCIsImNsaWVudFgiLCJzY3JvbGxlckNsYXNzZXMiLCJzY3JvbGxlcldyYXAiLCJzY3JvbGxlclRoZW1lZCIsInRoZW1lR2hvc3RIYWlybGluZSIsInNjcm9sbGVyIiwicmVtb3ZlQ00iLCJrZXlDb2RlIiwiY21nIiwiY21pIiwiaXRlbSIsImxhYmVsQ29udGFpbmVyIiwiY29sb3JEZWZhdWx0IiwibGFiZWwiLCJOYXRpdmVNb2R1bGUiLCJjb3B5IiwiZWxlbWVudHMiLCJxdWVyeUFsbCIsImZvY3VzZWQiLCJzZXBhcmF0b3IiLCJzY3JvbGxIZWlnaHQiLCJmdWxsUGF0aCIsImVsIiwibmFtZXMiLCJwYXJlbnROb2RlIiwidW5zaGlmdCIsIm93bmVyRG9jdW1lbnQiLCJ0YWdOYW1lIiwiZW50cmllcyIsInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJEaXNhYmxlVHlwaW5nIiwic3RhcnRUeXBpbmciLCJ0eXBpbmdNb2R1bGUiLCJkaXNhYmxlZCIsInN0b3BUeXBpbmciLCJyYW5kb20iLCJ2IiwiYXdhaXRpbmdCYWRnZXNQcm9taXNlcyIsImJhZGdlc1RvRmV0Y2giLCJEaXN0YW50U2VydmVyIiwiX2NhY2hlIiwibmV3UHJvbWlzZSIsInJlcyIsIkNvbnN0YW50cyIsImRlZmF1bHRVc2VycyIsImZldGNoZWRCYWRnZXMiLCJ1c2VycyIsImhhbmRsZVJlcXVlc3QiLCJSb3V0ZXMiLCJzdGF0dXMiLCJyZXNwb25zZUJvZHkiLCJqc29uIiwicHJvbWlzZSIsInVzZXJfaWQiLCJjYXRjaCIsIkxpZ2h0Y29yZEVycm9yIiwicm91dGUiLCJyZWplY3QiLCJub2RlRmV0Y2giLCJTRVJWRVJfVVJMIiwiaGVhZGVycyIsIkF1dGhvcml6YXRpb24iLCJCdWdIdW50ZXJCYWRnZSIsIkNpcmN1cyIsImhlYWQiLCJzY3JpcHQiLCJzcmMiLCJvbmxvYWQiLCJhbmltYXRlIiwidGltaW5nIiwiXyIsInVwZGF0ZSIsImR1cmF0aW9uIiwicGVyZm9ybWFuY2UiLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJ0aW1lIiwidGltZUZyYWN0aW9uIiwicHJvZ3Jlc3MiLCJRIiwicGFyc2VIVE1MIiwiaXNIVE1MIiwiTm9kZUxpc3QiLCJzb21lIiwibiIsIm5vZGVUeXBlIiwiYmFzZUVsZW1lbnQiLCJodG1sIiwiZnJhZ21lbnQiLCJ0ZW1wbGF0ZSIsImNsb25lTm9kZSIsImVzY2FwZUhUTUwiLCJ0ZXh0Tm9kZSIsImNyZWF0ZVRleHROb2RlIiwic3BhbkVsZW1lbnQiLCJub2RlVmFsdWUiLCJhZGRDbGFzcyIsInJlbW92ZUNsYXNzIiwidG9nZ2xlQ2xhc3MiLCJjbGFzc25hbWUiLCJpbmRpY2F0b3IiLCJoYXNDbGFzcyIsImV2ZXJ5IiwicmVwbGFjZUNsYXNzIiwib2xkTmFtZSIsIm5ld05hbWUiLCJhcHBlbmRUbyIsInRoaXNOb2RlIiwidGhhdE5vZGUiLCJwcmVwZW5kVG8iLCJwcmVwZW5kIiwiaW5zZXJ0QWZ0ZXIiLCJ0YXJnZXROb2RlIiwiaW5zZXJ0QmVmb3JlIiwibmV4dFNpYmxpbmciLCJuZXdOb2RlIiwibmV4dCIsIm5leHRBbGwiLCJuZXh0VW50aWwiLCJtYXRjaGVzIiwicHJldmlvdXMiLCJwcmV2aW91c0FsbCIsInByZXZpb3VzVW50aWwiLCJpbmRleEluUGFyZW50IiwibnVtIiwiaW5kZXgiLCJwYXJlbnQiLCJmaW5kQ2hpbGQiLCJmaW5kQ2hpbGRyZW4iLCJwYXJlbnRzIiwiY2xvc2VzdCIsInBhcmVudHNVbnRpbCIsInNpYmxpbmdzIiwiYXR0cmlidXRlIiwiZ2xvYmFsIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImhlaWdodCIsInRleHRDb250ZW50Iiwib3V0ZXJXaWR0aCIsIm9mZnNldFdpZHRoIiwib3V0ZXJIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJvZmZzZXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsaXN0ZW5lcnMiLCJfbGlzdGVuZXJzIiwib24iLCJldmVudCIsImRlbGVnYXRlIiwibmFtZXNwYWNlIiwiaGFzRGVsZWdhdGUiLCJldmVudEZ1bmMiLCJjYW5jZWwiLCJuZXdDYW5jZWwiLCJmaW5kSW5kZXgiLCJvbmNlIiwiX19vZmZBbGwiLCJtYXRjaEZpbHRlciIsImxpc3RlbmVyIiwiZGVmYXVsdEZpbHRlciIsIm9uTW91bnRDaGFuZ2UiLCJvbk1vdW50Iiwid3JhcHBlZENhbGxiYWNrIiwib2JzZXJ2ZXIiLCJub2RlcyIsInJlbW92ZWROb2RlcyIsImRpcmVjdE1hdGNoIiwicGFyZW50TWF0Y2giLCJvblVubW91bnQiLCJvbkFkZGVkIiwid3JhcCIsImRvbVdyYXBwZXIiLCJyZXNvbHZlRWxlbWVudCIsIkVtb2ppUmVnZXgiLCJDdXN0b21FbW9qaU1vZHVsZSIsIkN1c3RvbUVtb2ppIiwiRW1vamlNb2R1bGVBcGkiLCJnZXRDdXN0b21FbW9qaUJ5SWQiLCJBdXRvY29tcGxldGVNb2R1bGUiLCJBdXRvQ29tcGxldGlvblRlbXBsYXRlcyIsImdldEF1dG9jb21wbGV0ZU9wdGlvbnMiLCJFbW9qaU1vZHVsZVF1ZXJ5IiwicXVlcnlFbW9qaVJlc3VsdHMiLCJNZXNzYWdlcyIsIkVNT0pJX01BVENISU5HIiwiZ3VpbGRNb2R1bGUiLCJnZXRHdWlsZCIsImdldEd1aWxkcyIsImlzRmV0Y2hpbmciLCJlbW9qaVNlYXJjaCIsImdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQiLCJMSUdIVENPUkRfRU1PSklTIiwiYXJnMSIsImFyZzIiLCJjb25kaXRpb24iLCJzZXRFbW9qaVVzYWJsZSIsInF1ZXJ5UmVzdWx0cyIsInJlc3VsdHMiLCJyZW5kZXJSZXN1bHRzIiwiRCIsImVtb2ppcyIsIkVNT0pJIiwiRW1vamkiLCJlbW9qaSIsInVuaXF1ZU5hbWUiLCJzZW50aW5lbCIsImd1aWxkSWQiLCJnZXRQbGFpblRleHQiLCJpc0FuaW1hdGVkIiwiYW5pbWF0ZWQiLCJtYW5hZ2VkIiwib3JpZ2luYWxOYW1lIiwiZ2V0UmF3VGV4dCIsImNhbmNlbEVtb2ppUmVuZGVyIiwiY2FuY2VsRW1vdGVSZW5kZXIiLCJuZXdDb250ZW50IiwiaGFzUGFyc2VkIiwiZXhlYyIsInJhdyIsIndvcmRzIiwid29yZCIsImFyciIsImVtb2ppSWQiLCJqdW1ib2FibGUiLCJyZWR1Y2UiLCJjdXJyZW50Iiwic2hpZnQiLCJvIiwidSIsImQiLCJvbkNsaWNrIiwib25Ib3ZlciIsIlIiLCJwcmVmaXgiLCJUaXRsZSIsIkVtb2ppRmlsdGVyTW9kdWxlIiwiaXNFbW9qaURpc2FibGVkIiwiaXNVc2FibGUiLCJ1c2FibGUiLCJzdXJyb2dhdGVzIiwiZGl2ZXJzaXR5IiwiY2FjaGUyIiwicHJvY2Vzc0F0dGFjaG1lbnQiLCJpc1RydXN0ZWQiLCJjaGVja1ZpcnVzZXMiLCJyZXN1bHRDYWxsYmFjayIsInJlbW92ZUNhbGxiYWNrIiwiaXNIYXJtZnVsIiwia2V5d29yZCIsIm9vZiIsIm5vX2NvbW1lbnRzIiwicmVnZXhwcyIsInJlZ2V4IiwiaGFzaFRvVXJsIiwiY2hlY2tIYXNoIiwiZ2V0Q3VycmVudFdlYkNvbnRlbnRzIiwidXNlckFnZW50IiwiX19wYXRoIiwiaXNGcm9tTG9hZGVyIiwiY3J5cHRvIiwiYWxsb2MiLCJjcmVhdGVSZWFkU3RyZWFtIiwiY2h1bmsiLCJjb25jYXQiLCJoYXNoUmVzdWx0IiwiZGlnZXN0IiwicmVuZGVyVG9FbGVtZW50cyIsImZsb3dlclN0YXJNb2R1bGUiLCJmbG93ZXJTdGFyQ29udGFpbmVyIiwiY2hpbGRNb2R1bGUiLCJjaGlsZENvbnRhaW5lciIsImJvcmRlckNvbG9yIiwibmV4dE5vZGUiLCJjb25maXJtVGV4dCIsImRhbmdlciIsIm9uQ2FuY2VsIiwib25Db25maXJtIiwic2hlbGwiLCJvcGVuRXh0ZXJuYWwiLCJ0b29sdGlwV3JhcCIsInZpZXdCb3giLCJ4IiwieSIsIm1hc2siLCJmaWxsIiwicG9pbnRlckV2ZW50cyIsIm9mZmljaWFsIiwic3BhbiIsImZsb2F0IiwiZmxvd2VyU3RhciIsImdldEtleWVkQXJyYXkiLCJidWZmZXIiLCJpbnN0YWxsUGF0aCIsImN1cnNvciIsInN0cm9rZSIsInNhdmUiLCJPYmplY3RTdG9yYWdlIiwibG9jYWxTdG9yYWdlTW9kdWxlIiwibG9jYWxTdG9yYWdlIiwiaW1wbCIsImJ0b2EiLCJzZXRJbnRlcnZhbCIsInNhZmVKU09OUGFyc2UiLCJhdG9iIiwiZ2VuZXJhdGVLZXkiLCJkZWNpcGhlciIsImRlY3J5cHRlZCIsImZpbmFsIiwiY2lwaGVyIiwiZW5jcnlwdGVkIiwiUGx1Z2luTW9kdWxlIiwibG9hZFBsdWdpbkRhdGEiLCJsb2FkIiwic2F2ZVBsdWdpbkRhdGEiLCJjaGFubmVsU3dpdGNoIiwic3RhcnRQbHVnaW4iLCJzdG9wUGx1Z2luIiwiZW5hYmxlUGx1Z2luIiwiZGlzYWJsZVBsdWdpbiIsInRvZ2dsZVBsdWdpbiIsInAiLCJmaWxlbmFtZU9yTmFtZSIsImJkcGx1Z2luIiwiZGVsZXRlIiwiZWRpdCIsIm9wZW5JdGVtIiwidXBkYXRlUGx1Z2luTGlzdCIsInNhdmVkIiwibmV3TWVzc2FnZSIsIm9uTWVzc2FnZSIsIm9uU3dpdGNoIiwicG9wb3V0V2luZG93Iiwid2luZG93cyIsIk1hcCIsInBvcG91dE1vZHVsZSIsImdldFdpbmRvdyIsInNldEltbWVkaWF0ZSIsImJkRXZlbnRzIiwicmVtb3ZlVGhlbWVzIiwiYXBwbHlUaGVtZXMiLCJ0aGVtZU5hbWUiLCJ0aGVtZSIsImV4aXN0aW5nIiwidW5lc2NhcGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJWMl9QdWJsaWNTZXJ2ZXJzIiwiX2FwcGVuZEJ1dHRvbiIsIkxheWVyIiwicm9vdElkIiwiVjJDX1B1YmxpY1NlcnZlcnMiLCJyb290IiwiX3Jvb3QiLCJpbmplY3RSb290IiwiY2xhc3NOYW1lTGF5ZXJzIiwibGF5ZXJzIiwiYnV0dG9uIiwiYnRuIiwiY2lyY2xlQnV0dG9uTWFzayIsImNsYXNzTmFtZXR1dG9yaWFsQ29udGFpbmVyIiwiZG93bmxvYWRQcm9ncmVzcyIsInR1dG9yaWFsQ29udGFpbmVyIiwiYWRkQnV0dG9uIiwiZ3VpbGRQYXRjaCIsIkd1aWxkTGlzdCIsIndlYnBhY2tNb2R1bGVzIiwiR3VpbGRMaXN0T2xkIiwicmVtb3ZlQnV0dG9uIiwiQkRTaWRlYmFySGVhZGVyIiwiUHVyZUNvbXBvbmVudCIsInNpZGViYXJDb21wb25lbnRzIiwiSGVhZGVyIiwiSXRlbSIsImNoYW5nZWxvZ0J1dHRvbiIsIkhpc3RvcnkiLCJyZW5kZXJlZCIsImlzQ2xlYXJpbmdDYWNoZSIsIlYyX1NldHRpbmdzUGFuZWwiLCJ1cGRhdGVTZXR0aW5ncyIsInNpZGViYXIiLCJWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIiLCJyZWdpc3RlckNvbXBvbmVudHMiLCJyZWdpc3RlciIsIm1ha2VDb21wb25lbnQiLCJsaWdodGNvcmRDb21wb25lbnQiLCJQcmVzZW5jZUNvbXBvbmVudCIsIkFjY291bnRJbmZvc0NvbXBvbmVudCIsIkFwaVByZXZpZXdDb21wb25lbnQiLCJjb3JlQ29tcG9uZW50IiwiY3VzdG9tQ3NzQ29tcG9uZW50IiwicmVuZGVyQWRkb25QYW5lIiwiY29yZVNldHRpbmdzIiwiZ2V0U2V0dGluZ3MiLCJjYXRlZ29yaWVzIiwiU2V0Iiwic2VjdGlvbnMiLCJsaWdodGNvcmRTZXR0aW5ncyIsIlByZXNlbmNlU2V0dGluZ3MiLCJjaGVja2VkIiwicHVibGljU2VydmVyc01vZHVsZSIsInZvaWNlTW9kZSIsInRmSG91ciIsImNvbG9yZWRUZXh0IiwiZE1vZGUiLCJTZXR0aW5ncyIsImRldk1vZGUiLCJmb3JjZVVwZGF0ZSIsImNhbGxSaW5naW5nQmVhdCIsInNldHRpbmdzU3RvcmUiLCJzaG93Q3VycmVudEdhbWUiLCJ1cGRhdGVSZW1vdGVTZXR0aW5ncyIsImdldEN1cnJlbnRXaW5kb3ciLCJzZXRBbHdheXNPblRvcCIsIkFudGlBZERNIiwiYmx1clByaXZhdGUiLCJkaXNhYmxlVHlwaW5nIiwiYXBwU2V0dGluZ3MiLCJyZWxhdW5jaCIsImV4aXQiLCJjb3JlIiwiTm90aWZpY2F0aW9uc1VzZVNoaW0iLCJTZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiTWFyZ2luVG9wIiwiaXNDaGVja2VkIiwiU3dpdGNoIiwiQ29tcG9uZW50cyIsImlucHV0cyIsIkJ1dHRvbiIsImxvb2siLCJob3ZlckNvbG9yIiwiaXBjIiwic2VuZCIsImFyZ3YiLCJxdWl0Iiwic2Vzc2lvbiIsImNsZWFyQ2FjaGUiLCJWMkNfUHJlc2VuY2VTZXR0aW5ncyIsIlYyQ19BY2NvdW50SW5mb3MiLCJBcGlQcmV2aWV3IiwiQ3NzRWRpdG9yIiwiQ29udGVudExpc3QiLCJDb21wb25lbnQiLCJvcmlnaW5hbFJlbmRlciIsImVudW1lcmFibGUiLCJDYXJkTGlzdCIsIlNldHRpbmdDb21wb25lbnQiLCJwYW5lbHMiLCJwYW5lbCIsImdldENvbXBvbmVudCIsIkxDaXRlbXMiLCJMQ0Rldkl0ZW1zIiwiVGhlbWVNb2R1bGUiLCJsb2FkVGhlbWVEYXRhIiwic2F2ZVRoZW1lRGF0YSIsImVuYWJsZVRoZW1lIiwiZGlzYWJsZVRoZW1lIiwidG9nZ2xlVGhlbWUiLCJiZHRoZW1lIiwidXBkYXRlVGhlbWVMaXN0IiwiX3dpbmRvd0NvbmZpZ0ZpbGUiLCJ0cmFuc3BhcmVudCIsImZyYW1lIiwiY2hhckNvZGVBdCIsImdldFRleHRBcmVhIiwiY2hhbm5lbFRleHRBcmVhIiwidGl0bGVXcmFwcGVyIiwiaW5zZXJ0VGV4dCIsInRleHRhcmVhIiwiZm9jdXMiLCJzZWxlY3Rpb25TdGFydCIsInNlbGVjdGlvbkVuZCIsImV4ZWNDb21tYW5kIiwibW9kdWxlTmFtZSIsImdyb3VwQ29sbGFwc2VkIiwiZ3JvdXBFbmQiLCJmb3JtYXRTdHJpbmciLCJzdHJpbmciLCJyZXBsYWNlbWVudCIsImVzY2FwZSIsInBhcmFtcyIsImluc3RlYWQiLCJzaWxlbnQiLCJmb3JjZSIsIm9yaWdNZXRob2QiLCJjYW5jZWxlZCIsImNhbmNlbFBhdGNoIiwib3JpZ2luYWxNZXRob2QiLCJjYWxsT3JpZ2luYWxNZXRob2QiLCJ0ZW1wUmV0IiwiX19tb25rZXlQYXRjaGVkIiwiZGlzY29ubmVjdCIsImhhc05vdGljZSIsImZvcm0iLCJib3R0b20iLCJ0b2FzdFdyYXBwZXIiLCJpY29uIiwidGltZW91dCIsInRvYXN0RWxlbSIsImlubmVyVGV4dCIsIm1vZGFsTW9kdWxlIiwiaGlkZU9uRnVsbHNjcmVlbiIsImhlYWRlck1vZHVsZSIsImhlYWRlciIsImZvb3RlcjJNb2R1bGUiLCJmb2N1c0xvY2siLCJiYWNrZHJvcCIsImJhY2tkcm9wV2l0aExheWVyIiwiY2xvc2luZ0xpc3RlbmVycyIsInBsdWdpbkVycm9ycyIsInRoZW1lRXJyb3JzIiwiZ2VuZXJhdGVUYWIiLCJ0YWJzIiwiTW9kYWxTdGFjayIsIkNoYW5nZWxvZ0NsYXNzZXMiLCJUZXh0RWxlbWVudCIsIkZsZXhDaGlsZCIsIlRpdGxlcyIsIkNoYW5nZWxvZyIsImRlZmF1bHRQcm9wcyIsInNlbGVjdGFibGUiLCJNYXJrZG93blBhcnNlciIsImltYWdlIiwic3VidGl0bGUiLCJjZSIsImNoYW5nZWxvZ0l0ZW1zIiwiZW50cnkiLCJtYXJnaW4iLCJyZW5kZXJIZWFkZXIiLCJDaGlsZCIsImdyb3ciLCJzaHJpbmsiLCJ0YWciLCJUYWdzIiwiSDQiLCJTaXplcyIsIlNNQUxMIiwiQ29sb3JzIiwiU1RBTkRBUkQiLCJkYXRlIiwicmVuZGVyRm9vdGVyIiwiQW5jaG9yQ2xhc3NlcyIsImFuY2hvciIsImFuY2hvclVuZGVybGluZU9uSG92ZXIiLCJqb2luU3VwcG9ydFNlcnZlciIsImpvaW5CRDIiLCJzdXBwb3J0TGluayIsImRlZmF1bHRGb290ZXIiLCJvblNjcm9sbCIsIk1vZGFsQWN0aW9ucyIsIk1hcmtkb3duIiwiQ29uZmlybWF0aW9uTW9kYWwiLCJlbXB0eUZ1bmN0aW9uIiwib3Blbk1vZGFsIiwicmVkIiwibW9kYWxLZXkiLCJWMiIsImVkaXRvckRldGFjaGVkIiwicmVxIiwid2VicGFja0pzb25wIiwiX19leHRyYV9pZF9fIiwic2hvdWxkUHJvdGVjdCIsInRoZU1vZHVsZSIsImNsZWFyIiwic29ydCIsImdldFRva2VuIiwiZ2V0RW1haWwiLCJzaG93VG9rZW4iLCJwcm90ZWN0IiwiaXNEZWZhdWx0IiwibW9kIiwicHJveHkiLCJmdW5jIiwiX19wcm90b19fIiwicHJvcE5hbWVzIiwicHJvdG9OYW1lcyIsInByb3RvUHJvcCIsImludGVybmFsIiwiam9pbkJEMSIsIkludml0ZUFjdGlvbnMiLCJhY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsIiwibGVhdmVCRDEiLCJHdWlsZEFjdGlvbnMiLCJsZWF2ZUd1aWxkIiwibGVhdmVCRDIiLCJqb2luTEMiLCJsZWF2ZUxDIiwicmVhY3RDb21wb25lbnQiLCJhbmNob3JDbGFzc2VzIiwic2xhdGVFZGl0b3JDbGFzc2VzIiwibWVzc2FnZUNsYXNzZXMiLCJ1bnJlYWRNZW50aW9uc0JhciIsImd1aWxkc0Vycm9yIiwiTWVzc2FnZUNvbnRlbnRDb21wb25lbnQiLCJUb29sdGlwV3JhcHBlciIsIlRvb2x0aXBzIiwiaGlkZSIsInNob3ciLCJzdWJtaXQiLCJhY3RpdmF0ZVJhZ2luZ0RlbW9uIiwiZGlzbWlzcyIsIktleUdlbmVyYXRvciIsIkxheWVyU3RhY2siLCJVc2VyU3RvcmUiLCJDaGFubmVsU3RvcmUiLCJDaGFubmVsQWN0aW9ucyIsIlByaXZhdGVDaGFubmVsQWN0aW9ucyIsIm9wZW5ETSIsInVzZXJJZCIsInNlbGZJZCIsInByaXZhdGVDaGFubmVsSWQiLCJnZXRETUZyb21Vc2VySWQiLCJzZWxlY3RQcml2YXRlQ2hhbm5lbCIsIm9wZW5Qcml2YXRlQ2hhbm5lbCIsInBhcnNlU2V0dGluZ3MiLCJWb2ljZU1vZGUiLCJtYXJnaW5Nb2R1bGUyIiwiZGVmYXVsdE1hcmdpbmg1IiwiY29sb3JNb2R1bGUiLCJjb2xvclN0YW5kYXJkIiwic2l6ZU1vZHVsZSIsInNjcm9sbGJhck1vZHVsZTEiLCJzY3JvbGxiYXJHaG9zdEhhaXJsaW5lIiwiR3VpbGRNb2R1bGUiLCJnZXRSZWxhdGlvbnNoaXBzIiwic2Vzc2lvbk1vZHVsZSIsImdldFNlc3Npb25zIiwic2l6ZTE0IiwiaDUiLCJnZXRQcm9maWxlVmFsdWUiLCJnZXRTdGF0aXN0aWNzIiwiZ2V0U2Vzc2lvblZhbHVlIiwibWFyZ2luQm90dG9tMjAiLCJzZXNzaW9uc1JhdyIsInNlc3Npb25zIiwic2Vzc2lvbklkIiwiY2xpZW50SW5mbyIsIm9zIiwiY2xpZW50IiwiYWN0aXZpdGllcyIsInJlcGVhdCIsImNyZWF0ZWRBdCIsImF2YXRhclVSTCIsImF2YXRhciIsImdldEF2YXRhclVSTCIsImdldERhdGUiLCJnZXRNb250aCIsImdldEZ1bGxZZWFyIiwiZ2V0SG91cnMiLCJnZXRNaW51dGVzIiwiZ2V0U2Vjb25kcyIsImZsYWdzIiwiaGFzUHJlbWl1bVN1YnNjcmlwdGlvbiIsImVtYWlsIiwibWZhRW5hYmxlZCIsIm1vYmlsZSIsInBob25lIiwidmVyaWZpZWQiLCJyZWxhdGlvbnMiLCJmcmllbmRzIiwiaXNGcmllbmQiLCJpc0Jsb2NrZWQiLCJoaWdodGxpZ2h0SlMiLCJoaWdobGlnaHQiLCJtZXNzYWdlTW9kdWxlMSIsIm1lc3NhZ2VNb2R1bGUyIiwiQ29kZUNvbnRlbnQiLCJfX2h0bWwiLCJsYW5ndWFnZSIsIm1hcmdpbkJvdHRvbTgiLCJmb3JtTW9kdWxlIiwic3RhdGVzIiwiRm9ybVNlY3Rpb24iLCJhbGxDb21wb25lbnRzIiwiY29tcCIsImNvbXBOYW1lIiwiY29tcFBhdGgiLCJyZW5kZXJzIiwiQ29tcG9uZW50UHJldmlldyIsInRhYiIsIkFsbFByZXZpZXdzIiwiZ2V0UHJvcHMiLCJyZW5kZXJQcmV2aWV3IiwiYmFja2dyb3VuZENvbG9yIiwicGFkZGluZyIsImJvcmRlclJhZGl1cyIsInJlbmRlckNvZGUiLCJnZW5lcmF0ZUNvZGUiLCJnZXRTdHJGb3JQcm9wIiwibGFuZyIsIlN0cmluZyIsIiQkdHlwZW9mIiwiU3ltYm9sIiwiZm9yIiwiY29tcENhdGVnb3J5IiwicHJvcFN0cmluZ3MiLCJjaGlsZHJlblByb3AiLCJzdHIiLCJvcGVuVGFnIiwiY2xvc2VUYWciLCJ2aXNpYmxlS2V5IiwicHJvcE9iamVjdCIsImlzTGFzdCIsImlzRmlyc3QiLCJjaGlsZHJlbkRhdGEiLCJoZWxwIiwic3VjY2VzcyIsInNldFN0YXRlIiwibWFyZ2luQm90dG9tIiwiVjJDX1BsdWdpbkNhcmQiLCJzaG93U2V0dGluZ3MiLCJzZXRJbml0aWFsU3RhdGUiLCJoYXNTZXR0aW5ncyIsImFkZG9uIiwiZ2V0U2V0dGluZ3NQYW5lbCIsInJlbG9hZHMiLCJ0cnVzdGVkIiwiY2xvc2VTZXR0aW5ncyIsInBhbmVsUmVmIiwic2V0dGluZ3NPcGVuIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVmcyIsInNldHRpbmdzcGFuZWwiLCJpc0hpZGRlbiIsImNUb3AiLCJzY3JvbGxUb3AiLCJjQm90dG9tIiwiZVRvcCIsIm9mZnNldFRvcCIsImVCb3R0b20iLCJjYXJkTm9kZSIsInRoaXNOb2RlT2Zmc2V0IiwiY29udGFpbmVyT2Zmc2V0IiwiZW5kUG9pbnQiLCJnZXRTdHJpbmciLCJzZXR0aW5nc0NvbXBvbmVudCIsInJlZiIsIlhTdmciLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsImJ1aWxkVGl0bGUiLCJuYW1lSW5kZXgiLCJ2ZXJzaW9uSW5kZXgiLCJhdXRob3JJbmRleCIsInBvcExheWVyIiwibWFrZUxpbmsiLCJtYWtlQnV0dG9uIiwiYWN0aW9uIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1bm1vdW50ZWQiLCJsaW5rcyIsImludml0ZSIsInRlc3RlciIsImRvbmF0ZSIsInBhdHJlb24iLCJhdXRob3JJZCIsImF1dGhvckxpbmsiLCJpc1NjYW5uaW5nIiwiVG9vbHRpcCIsImFzY2VuZGluZyIsImlzUGx1Z2lucyIsInJldmVyc2UiLCJvbkFkZG9uQ2hhbmdlcyIsImNvbXBvbmVudERpZE1vdW50Iiwib3BlbkZvbGRlciIsIm9wZW5QYXRoIiwic2hvdWxkRGVsZXRlIiwiY29uZmlybURlbGV0ZSIsInNvcnRPcHRpb25zIiwiZGlyZWN0aW9ucyIsInRvTG9jYWxlTG93ZXJDYXNlIiwiZ2V0QWRkb25zIiwic29ydGVkQWRkb25zIiwiYiIsImNhcCIsImZpcnN0Iiwic2Vjb25kIiwibG9jYWxlQ29tcGFyZSIsInJlbmRlckNoZWNrVXBkYXRlcyIsIlplcmVzUGx1Z2luTGlicmFyeSIsIlBsdWdpblVwZGF0ZXMiLCJjaGVja0FsbCIsInRvb2x0aXBJc1Nob3dpbmciLCJ0b29sdGlwIiwibWFyZ2luTGVmdCIsImNoZWNrVXBkYXRlQnV0dG9uIiwiRW11bGF0ZWRUb29sdGlwIiwiYXR0YWNoRXZlbnRzIiwicmVmcmVzaEljb24iLCJhZGRvbkNhcmRzIiwiZmlsbFJ1bGUiLCJjbGlwUnVsZSIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsIm9wYWNpdHkiLCJWMkNfQ2hlY2tib3giLCJjaGVja2JveEVsZW1lbnQiLCJjaGVja2JveCIsImNoZWNrYm94SW5uZXIiLCJTZWxlY3QiLCJkcm9wZG93biIsImNyZWF0ZVJlZiIsInNob3dNZW51IiwiaGlkZU1lbnUiLCJvcHQiLCJpc09wZW4iLCJTZWFyY2giLCJvbktleURvd24iLCJwbGFjZWhvbGRlciIsInN3aXRjaCIsIlYyQ19Db250ZW50Q29sdW1uIiwiY29udGVudE1vZHVsZSIsImNvbnRlbnRDb2x1bW4iLCJjb250ZW50Q29sdW1uRGVmYXVsdCIsIlYyQ19Dc3NFZGl0b3IiLCJsaW5lcyIsImRldGFjaGVkRWRpdG9yIiwiVjJDX0Nzc0VkaXRvckRldGFjaGVkIiwidXBkYXRlQ3NzIiwic2F2ZUNzcyIsImRldGFjaCIsImRldGFjaGVkIiwiZWRpdG9yIiwiYWNlIiwic2V0VGhlbWUiLCJzZXRNb2RlIiwic2V0U2hvd1ByaW50TWFyZ2luIiwic2V0Rm9udFNpemUiLCJkZXN0cm95IiwicHJldlByb3BzIiwicHJldlN0YXRlIiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsImRldGFjaGVkUm9vdCIsImNvZGVNaXJyb3IiLCJsaW5lTnVtYmVycyIsIm1vZGUiLCJpbmRlbnRVbml0Iiwic2Nyb2xsYmFyU3R5bGUiLCJfY2NzcyIsImNjc3MiLCJ1cGRhdGVMaW5lQ291bnQiLCJsaW5lQ291bnQiLCJTZXR0aW5nc1RpdGxlIiwiQ2hlY2tib3giLCJib3JkZXJSaWdodCIsImJvcmRlckxlZnQiLCJmb250U2l6ZSIsImFyZyIsImdldFZhbHVlIiwiZHJvb3QiLCJpbmplY3REZXRhY2hlZFJvb3QiLCJCREVycm9yQm91bmRhcnkiLCJoYXNFcnJvciIsImNvbXBvbmVudERpZENhdGNoIiwiRGVsZXRlIiwiRG93bkFycm93IiwiRWRpdCIsIm1hcmdpbk1vZHVsZSIsIm1hcmdpblRvcDYwIiwiVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzIiwicHJldmlldyIsImlzZmV0Y2hpbmciLCJhc3NldENvbXBvbmVudHMiLCJ1cGRhdGVXaGVuRmV0Y2hlZCIsImRlZmF1bHRTZXR0aW5nIiwiUlBDUHJvcHMiLCJhc3NldCIsInVwZGF0ZVByZXZpZXciLCJvcHRpb25zQ29tcG9uZW50cyIsIm9oZ29kb2hmdWNrIiwiX29wdGlvbnNDb21wb25lbnRzIiwiYXJyYXkiLCJpbnB1dFRleHRNb2R1bGVzIiwiSW5wdXRUZXh0IiwicmVtb3ZlS2V5YmluZCIsIl9ob3Jpem9udGFsIiwiaW5wdXRNaW5pIiwic2l6ZTE2Iiwic2l6ZTIwIiwiaW5wdXQiLCJsYXN0RWRpdGVkIiwiaXNUaW1pbmciLCJyb3dNb2R1bGUiLCJmbGV4TW9kdWxlIiwiaW5wdXRNb2R1bGUiLCJzaXplTW9kdWxlMiIsInJvdyIsImZsZXhDaGlsZCIsIklucHV0TnVtYmVyTW9kdWxlcyIsIklucHV0TnVtYmVyIiwiY29sb3JUcmFuc3BhcmVudCIsInNldFZhbHVlIiwiY2xpcGJvYXJkIiwiSW5wdXRDaG9pY2VNb2R1bGVzIiwiSW5wdXRDaG9pY2UiLCJEaXZpZGVyTW9kdWxlcyIsIkRpdmlkZXIiLCJkaXZpZGVyIiwiZGl2aWRlckRlZmF1bHQiLCJEaXNjb3JkQnV0dG9uIiwiUnBjUHJldmlldyIsImFjdGl2ZSIsImNoYW5nZVRhYiIsImFuY2llbnRUYWIiLCJzZXRBY3RpdmUiLCJmbGV4IiwicnBjIiwiaXNBY3RpdmUiLCJQcm9maWxlIiwiUG9wb3V0IiwiVGFiIiwiZW1wdHlDbGFzc2VzIiwiUHJlc2VuY2VFcnJvckNhdGNoZXIiLCJlcnJJbmZvIiwiZW1wdHlTdGF0ZUltYWdlIiwiZW1wdHlTdGF0ZSIsImVtcHR5U3RhdGVIZWFkZXIiLCJlbXB0eVN0YXRlU3VidGV4dCIsInBvcG91dE1vZHVsZXMiLCJVc2VyUG9wb3V0Q29tcG9uZW50IiwiUG9wb3V0UHJvcHMiLCJVc2VyUG9wb3V0IiwicmVuZGVyMSIsImNoYW5uZWxJZCIsImRpc2FibGVVc2VyUHJvZmlsZUxpbmsiLCJfVXNlclBvcG91dCIsInBvcG91dCIsImV4Y2x1ZGVQcm9wZXJ0aWVzIiwicHJvZmlsZU1vZHVsZXMiLCJVc2VyUHJvZmlsZUNvbXBvbmVudCIsIlByb2ZpbGVQcm9wcyIsImNvbm5lY3RlZFByb2ZpbGVTdG9yZSIsIlVzZXJQcm9maWxlIiwicmVuZGVyMiIsInJlbmRlcjMiLCJyZW5kZXI0IiwicHJvZmlsZSIsIlYyQ19MYXllciIsImtleXVwTGlzdGVuZXIiLCJ0cmFuc2Zvcm0iLCJjb21wb25lbnRXaWxsTW91bnQiLCJjaGFuZ2VDYXRlZ29yeSIsInNlYXJjaEtleURvd24iLCJjaGVja0Nvbm5lY3Rpb24iLCJjb25uZWN0IiwiR3VpbGRTdG9yZSIsIkF2YXRhckRlZmF1bHRzIiwiU29ydGVkR3VpbGRTdG9yZSIsInNlbGVjdGVkQ2F0ZWdvcnkiLCJsb2FkaW5nIiwic2VydmVycyIsImNvbm5lY3Rpb24iLCJmZXRjaCIsInNlcnZlciIsImpvaW5lZCIsImVuZCIsInRlcm0iLCJjYXRlZ29yeUJ1dHRvbnMiLCJ0b3RhbCIsInNidiIsImNvbnRlbnRTY3JvbGxlciIsInNlcnZlckNhcmQiLCJwaW5uZWQiLCJhY2NlcHRJbnZpdGUiLCJpbnZpdGVfY29kZSIsImpvaW5FbmRQb2ludCIsImlkZW50aWZpZXIiLCJjcmVkZW50aWFscyIsIndpbmRvd09wdGlvbnMiLCJyb3VuZCIsInNjcmVlblgiLCJzY3JlZW5ZIiwiam9pbldpbmRvdyIsIkJyb3dzZXJXaW5kb3ciLCJ3ZWJDb250ZW50cyIsImxvYWRVUkwiLCJyZXNpemFibGUiLCJtYXhpbWl6YWJsZSIsIm1pbmltaXphYmxlIiwiYWx3YXlzT25Ub3AiLCJjZW50ZXIiLCJ3ZWJQcmVmZXJlbmNlcyIsIm5vZGVJbnRlZ3JhdGlvbiIsImJkU2VydmVyIiwib25saW5lIiwibWVtYmVycyIsImljb25VcmwiLCJuYXRpdmVqb2luIiwic2VydmVyMiIsImd1aWxkTGlzdCIsImdldEZsYXR0ZW5lZEd1aWxkSWRzIiwiZGVmYXVsdExpc3QiLCJERUZBVUxUX0FWQVRBUlMiLCJTZXJ2ZXJDYXJkIiwiZmFsbGJhY2siLCJmbG9vciIsImNvbm5lY3RFbmRQb2ludCIsInJlc3BvbnNlIiwiU2lkZWJhclZpZXciLCJ0b29scyIsIlRvb2xzIiwiVGFiQmFyU2VwYXJhdG9yIiwic2VhcmNoSW5wdXQiLCJUYWJCYXJIZWFkZXIiLCJUYWJCYXJJdGVtIiwibWF4TGVuZ3RoIiwic2VhcmNoaW5wdXQiLCJub3RDb25uZWN0ZWQiLCJjb2x1bW5Nb2R1bGUiLCJtaW5IZWlnaHQiLCJsaW5lSGVpZ2h0IiwiVjJDX1NlcnZlckNhcmQiLCJpbWFnZUVycm9yIiwiY2FyZE1vZHVsZSIsImNhcmQiLCJjYXJkUHJpbWFyeSIsIl9ob3Jpem9udGFsUmV2ZXJzZSIsIndyYXBNb2R1bGUiLCJub1dyYXAiLCJzdHJlYW1lck1vZGVFbmFibGVkIiwib25FcnJvciIsImhhbmRsZUVycm9yIiwiZHJhZ2dhYmxlIiwiaG9yaXpvbnRhbCIsIlYyQ19TaWRlYmFyVmlldyIsIlNjcm9sbGVyIiwiZmFkZSIsImRhcmsiLCJWMkNfUmVsb2FkSWNvbiIsInhtbG5zIiwiVjJDX1Njcm9sbGVyIiwic2Nyb2xsZXJNb2R1bGUxIiwic2Nyb2xsZXJIb3Jpem9udGFsIiwic2Nyb2xsZXJNb2R1bGUyIiwic2lkZWJhclJlZ2lvblNjcm9sbGVyIiwid3JhcHBlckNsYXNzIiwic2Nyb2xsZXJGYWRlIiwic2Nyb2xsZXJDbGFzcyIsImNvbnRlbnRSZWdpb25TY3JvbGxlciIsImNvbnRlbnRSZWdpb25TY3JvbGxlcldyYXAiLCJ0aGVtZUdob3N0Iiwic2Nyb2xsZXJUcmFjayIsIlYyQ19TZWN0aW9uZWRTZXR0aW5nc1BhbmVsIiwiU2V0dGluZ3NHcm91cCIsIlYyQ19TZXR0aW5nc0dyb3VwIiwiYnV0dG9uQ29tcG9uZW50IiwiVjJDX1NldHRpbmdzVGl0bGUiLCJjbGFzc25hbWVzIiwiZ2V0Q2xhc3NOYW1lIiwiU3dpdGNoSXRlbSIsImJldGEiLCJ1c2VyU2V0dGluZ3NWb2ljZSIsIlYyQ19UYWJCYXJIZWFkZXIiLCJWMkNfVGFiQmFySXRlbSIsIlYyQ19UYWJCYXJTZXBhcmF0b3IiLCJWMkNfVG9vbHMiLCJ0b29sc01vZHVsZSIsInRvb2xzQ29udGFpbmVyIiwiY29udGFpbmVyTW9kdWxlIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkJvbGQiLCJrZXliaW5kIiwia2V5YmluZEJvbGQiLCJUb29sdGlwQ2xhc3NlcyIsImdldFRvb2x0aXBDbGFzc2VzIiwiVG9vbHRpcExheWVycyIsImdldFRvb2x0aXBMYXllcnMiLCJnZXRDbGFzcyIsInNpZGVPckNvbG9yIiwidXBwZXJDYXNlIiwidG9vbHRpcENsYXNzIiwiY2xhc3NFeGlzdHMiLCJ0b1B4IiwicHJldmVudEZsaXAiLCJ0b29sdGlwRWxlbWVudCIsImxhYmVsRWxlbWVudCIsInRvb2x0aXBDb250ZW50IiwicG9pbnRlckVsZW1lbnQiLCJ0b29sdGlwUG9pbnRlciIsInBvcG91dHMiLCJjYW5TaG93QWJvdmUiLCJjYW5TaG93QmVsb3ciLCJjYW5TaG93TGVmdCIsImNhblNob3dSaWdodCIsIl9jbGFzc05hbWUiLCJzaG93QWJvdmUiLCJzaG93QmVsb3ciLCJzaG93TGVmdCIsInNob3dSaWdodCIsImNlbnRlckhvcml6b250YWxseSIsImNlbnRlclZlcnRpY2FsbHkiLCJub2RlY2VudGVyIiwiZmluZERPTU5vZGUiLCJWMkNfWFN2ZyJdLCJtYXBwaW5ncyI6Ijs7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7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YUFBTyxFQUFFLFdBQS9DO0FBQTREaHBCLFdBQUssRUFBRTtBQUFDcVQsYUFBSyxFQUFFLE1BQVI7QUFBZ0IyTSxjQUFNLEVBQUU7QUFBeEI7QUFBbkUsS0FGRyxFQUdIbjBCLG1EQUFJLENBQUNxa0IsS0FBTCxDQUFXbmpCLGFBQVgsQ0FDSSxHQURKLEVBRUk7QUFBQ0MsZUFBUyxFQUFFLFlBQVo7QUFBMEJvOEIsVUFBSSxFQUFFLE1BQWhDO0FBQXdDdWYsY0FBUSxFQUFFO0FBQWxELEtBRkosRUFHSTk4QyxtREFBSSxDQUFDcWtCLEtBQUwsQ0FBV25qQixhQUFYLENBQXlCLE1BQXpCLEVBQWlDO0FBQUM4NEIsT0FBQyxFQUFFO0FBQUosS0FBakMsQ0FISixFQUlJaDZCLG1EQUFJLENBQUNxa0IsS0FBTCxDQUFXbmpCLGFBQVgsQ0FBeUIsTUFBekIsRUFBaUM7QUFBQ0MsZUFBUyxFQUFFLE1BQVo7QUFBb0JvOEIsVUFBSSxFQUFFLFNBQTFCO0FBQXFDdkQsT0FBQyxFQUFFO0FBQXhDLEtBQWpDLENBSkosQ0FIRyxDQUFQO0FBVUg7O0FBaEJxRCxDOzs7Ozs7Ozs7OztBQ0YxRCxtQzs7Ozs7Ozs7Ozs7QUNBQSxxQzs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSwrQjs7Ozs7Ozs7Ozs7QUNBQSxtQzs7Ozs7Ozs7Ozs7QUNBQSx1Qzs7Ozs7Ozs7Ozs7QUNBQSxpQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LmpzXCIpO1xuIiwiZXhwb3J0IGNvbnN0IG1pbmltdW1EaXNjb3JkVmVyc2lvbiA9IFwiMC4wLjMwNlwiO1xyXG5leHBvcnQgY29uc3QgY3VycmVudERpc2NvcmRWZXJzaW9uID0gKHdpbmRvdy5EaXNjb3JkTmF0aXZlICYmIHdpbmRvdy5EaXNjb3JkTmF0aXZlLnJlbW90ZUFwcCAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbiAmJiB3aW5kb3cuRGlzY29yZE5hdGl2ZS5yZW1vdGVBcHAuZ2V0VmVyc2lvbigpKSB8fCBcIjAuMC4zMDZcIjtcclxuZXhwb3J0IGNvbnN0IG1pblN1cHBvcnRlZFZlcnNpb24gPSBcIjAuMy4wXCI7XHJcbmV4cG9ydCBjb25zdCBiYmRWZXJzaW9uID0gXCIwLjMuNVwiO1xyXG5leHBvcnQgY29uc3QgYmJkQ2hhbmdlbG9nID0ge1xyXG4gICAgZGVzY3JpcHRpb246IFwiQmlnIHRoaW5ncyBhcmUgY29taW5nLlwiLFxyXG4gICAgY2hhbmdlczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGl0bGU6IFwiQnVnIEZpeGVzXCIsXHJcbiAgICAgICAgICAgIHR5cGU6IFwiZml4ZWRcIixcclxuICAgICAgICAgICAgaXRlbXM6IFtcclxuICAgICAgICAgICAgICAgIFwiU29tZSBmaXhlcyByZWxhdGVkIHRvIHNob3dpbmcgbW9kYWxzIGluIHRoZSBgQmRBcGlgLlwiLFxyXG4gICAgICAgICAgICAgICAgXCJGaXhlZCB0aGUgb3BlbiBmb2xkZXIgYnV0dG9ucyBmb3IgcGx1Z2lucyBhbmQgdGhlbWVzXCJcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgIH1cclxuICAgIF1cclxufTtcclxuXHJcbmV4cG9ydCBjb25zdCBzZXR0aW5ncyA9IHtcclxuICAgIFwiQ3VzdG9tIGNzcyBsaXZlIHVwZGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMFwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcclxuICAgIFwiQ3VzdG9tIGNzcyBhdXRvIHVkcGF0ZVwiOiAgICAge2lkOiBcImJkYS1jc3MtMVwiLCBpbmZvOiBcIlwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IHRydWUsICBjYXQ6IFwiY29yZVwifSxcclxuICAgIFwiQmV0dGVyRGlzY29yZCBCbHVlXCI6ICAgICAgICAge2lkOiBcImJkYS1ncy1iXCIsICBpbmZvOiBcIlJlcGxhY2UgRGlzY29yZCBibHVlIHdpdGggQkQgQmx1ZVwiLCAgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IGZhbHNlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIn0sXHJcblxyXG4gICAgLyogQ29yZSAqL1xyXG4gICAgLyogPT09PT09ICovXHJcbiAgICBcIlB1YmxpYyBTZXJ2ZXJzXCI6ICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtMVwiLCAgaW5mbzogXCJEaXNwbGF5IHB1YmxpYyBzZXJ2ZXJzIGJ1dHRvblwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiTWluaW1hbCBNb2RlXCI6ICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy0yXCIsICBpbmZvOiBcIkhpZGUgZWxlbWVudHMgYW5kIHJlZHVjZSB0aGUgc2l6ZSBvZiBlbGVtZW50cy5cIiwgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJWb2ljZSBNb2RlXCI6ICAgICAgICAgICAgICAgICB7aWQ6IFwiYmRhLWdzLTRcIiwgIGluZm86IFwiT25seSBzaG93IHZvaWNlIGNoYXRcIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIkhpZGUgQ2hhbm5lbHNcIjogICAgICAgICAgICAgIHtpZDogXCJiZGEtZ3MtM1wiLCAgaW5mbzogXCJIaWRlIGNoYW5uZWxzIGluIG1pbmltYWwgbW9kZVwiLCAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiRGFyayBNb2RlXCI6ICAgICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy01XCIsICBpbmZvOiBcIk1ha2UgY2VydGFpbiBlbGVtZW50cyBkYXJrIGJ5IGRlZmF1bHQod2lwKVwiLCAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJWb2ljZSBEaXNjb25uZWN0XCI6ICAgICAgICAgICB7aWQ6IFwiYmRhLWRjLTBcIiwgIGluZm86IFwiRGlzY29ubmVjdCBmcm9tIHZvaWNlIHNlcnZlciB3aGVuIGNsb3NpbmcgRGlzY29yZFwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcIm1vZHVsZXNcIn0sXHJcbiAgICBcIjI0IEhvdXIgVGltZXN0YW1wc1wiOiAgICAgICAgIHtpZDogXCJiZGEtZ3MtNlwiLCAgaW5mbzogXCJSZXBsYWNlIDEyaHIgdGltZXN0YW1wcyB3aXRoIHByb3BlciBvbmVzXCIsICAgICAgICAgIGltcGxlbWVudGVkOiB0cnVlLCAgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwibW9kdWxlc1wifSxcclxuICAgIFwiQ29sb3JlZCBUZXh0XCI6ICAgICAgICAgICAgICAge2lkOiBcImJkYS1ncy03XCIsICBpbmZvOiBcIk1ha2UgdGV4dCBjb2xvciB0aGUgc2FtZSBhcyByb2xlIGNvbG9yXCIsICAgICAgICAgICAgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG4gICAgXCJOb3JtYWxpemUgQ2xhc3Nlc1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy00XCIsIGluZm86IFwiQWRkcyBzdGFibGUgY2xhc3NlcyB0byBlbGVtZW50cyB0byBoZWxwIHRoZW1lcy4gKGUuZy4gYWRkcyAuZGEtY2hhbm5lbHMgdG8gLmNoYW5uZWxzLUllMmw2QSlcIiwgaW1wbGVtZW50ZWQ6IHRydWUsICBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJtb2R1bGVzXCJ9LFxyXG5cclxuICAgIC8qIENvbnRlbnQgKi9cclxuICAgIFwiQ29udGVudCBFcnJvciBNb2RhbFwiOiAgICAgICAge2lkOiBcImZvcmstcHMtMVwiLCBpbmZvOiBcIlNob3dzIGEgbW9kYWwgd2l0aCBwbHVnaW4vdGhlbWUgZXJyb3JzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlNjYW4gUGx1Z2luc1wiOiAgICAgICAgICAgICAgIHtpZDogXCJmb3JrLXBzLTZcIiwgaW5mbzogXCJTY2FuIHBsdWdpbnMgZm9yIGFueSB0aHJlYXQgdGhhdCBjYW4gYmUgaGlkZGVuIGluc2lkZS5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2hvdyBUb2FzdHNcIjogICAgICAgICAgICAgICAge2lkOiBcImZvcmstcHMtMlwiLCBpbmZvOiBcIlNob3dzIGEgc21hbGwgbm90aWZpY2F0aW9uIGZvciBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJjb3JlXCIsIGNhdGVnb3J5OiBcImNvbnRlbnQgbWFuYWdlclwifSxcclxuICAgIFwiU2Nyb2xsIFRvIFNldHRpbmdzXCI6ICAgICAgICAge2lkOiBcImZvcmstcHMtM1wiLCBpbmZvOiBcIkF1dG8tc2Nyb2xscyB0byBhIHBsdWdpbidzIHNldHRpbmdzIHdoZW4gdGhlIGJ1dHRvbiBpcyBjbGlja2VkIChvbmx5IGlmIG91dCBvZiB2aWV3KVwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImNvcmVcIiwgY2F0ZWdvcnk6IFwiY29udGVudCBtYW5hZ2VyXCJ9LFxyXG4gICAgXCJBdXRvbWF0aWMgTG9hZGluZ1wiOiAgICAgICAgICB7aWQ6IFwiZm9yay1wcy01XCIsIGluZm86IFwiQXV0b21hdGljYWxseSBsb2FkcywgcmVsb2FkcywgYW5kIHVubG9hZHMgcGx1Z2lucyBhbmQgdGhlbWVzXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIkVuYWJsZSBFZGl0IEJ1dHRvblwiOiAgICAgICAgIHtpZDogXCJmb3JrLXBzLTdcIiwgaW5mbzogXCJFbmFibGUgYW4gRWRpdCBCdXR0b24gb24gdGhlIHBsdWdpbiBhbmQgdGhlbWUgcGFuZWwuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIn0sXHJcbiAgICBcIlRoZW1lcyBpbiBQb3BvdXQgV2luZG93XCI6ICAgIHtpZDogXCJsaWdodGNvcmQtOVwiLCBpbmZvOiBcIkVuYWJsZSB0aGVtZXMgaW4gUG9wb3V0IFdpbmRvdy4gKEZvciBleGFtcGxlLCB3aGVuIGRldGFjaGluZyBzY3JlZW5zaGFyZS4pXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJjb250ZW50IG1hbmFnZXJcIiwgZXhwZXJpbWVudGFsOiB0cnVlfSxcclxuXHJcbiAgICAvKiBEZXZlbG9wZXIgKi9cclxuICAgIFwiRGV2ZWxvcGVyIE1vZGVcIjogICAgICAgICBcdCAge2lkOiBcImJkYS1ncy04XCIsIGluZm86IFwiRGV2ZWxvcGVyIE1vZGUgVG9nZ2xlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcbiAgICBcIkNvcHkgU2VsZWN0b3JcIjpcdFx0XHQgIHtpZDogXCJmb3JrLWRtLTFcIiwgaW5mbzogXCJBZGRzIGEgXFxcIkNvcHkgU2VsZWN0b3JcXFwiIG9wdGlvbiB0byBjb250ZXh0IG1lbnVzIHdoZW4gZGV2ZWxvcGVyIG1vZGUgaXMgYWN0aXZlXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwiY29yZVwiLCBjYXRlZ29yeTogXCJkZXZlbG9wZXIgc2V0dGluZ3NcIn0sXHJcblxyXG4gICAgLyoqIExpZ2h0Y29yZCAqL1xyXG4gICAgXCJEaXNhYmxlIEJldHRlckRpc2NvcmRcIjogICAgICB7aWQ6IFwiYmQtZGlzYWJsZVwiLCAgaW5mbzogXCJEaXNhYmxlIEJldHRlcmRpc2NvcmQgKHBsdWdpbnMsIHRoZW1lcywgZXRjKSAoTm90IGltcGxlbWVudGVkKS5cIiwgaW1wbGVtZW50ZWQ6IGZhbHNlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQmx1ciBQZXJzb25hbCBJbmZvcm1hdGlvblwiOiAge2lkOiBcImxpZ2h0Y29yZC02XCIsIGluZm86IFwiQmx1ciBzZW5zaXRpdmUgaW5mb3JtYXRpb25zIGxpa2UgZW1haWwsIHBheW1lbnQgaW5mb3MgYW5kIG1vcmUuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiQ2FsbGluZyBSaW5nIEJlYXRcIjogICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC0yXCIsIGluZm86IFwiRW5hYmxlIERpc2NvcmQncyBzcGVjaWFsIGNhbGxpbmcgYmVhdC5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEZXZlbG9wZXIgT3B0aW9uc1wiOiAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTFcIiwgaW5mbzogXCJFbmFibGUgRGlzY29yZCdzICYgTGlnaHRjb3JkJ3MgSW50ZXJuYWwgRGV2ZWxvcGVyIE9wdGlvbnMuIFRoaXMgYWxsb3cgdGhlIFxcXCJFeHBlcmltZW50c1xcXCIgdGFiLCB0aGUgXFxcIkRldmVsb3BlciBPcHRpb25zXFxcIiB0YWIgYW5kIHRoZSBcXFwiTGlnaHRjb3JkIEFwaVxcXCIgc2VjdGlvbi5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJBZCBCbG9ja1wiOiAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTRcIiwgaW5mbzogXCJCbG9jayBhbnkgQk9UIHRoYXQgZG1zIHlvdSB3aXRoIGFuIGludml0ZSBsaW5rLiBFdmVuIGluIGFuIGVtYmVkLlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJMaWdodGNvcmRcIn0sXHJcbiAgICBcIkVuYWJsZSBMaWdodGNvcmQgU2VydmVyc1wiOiAgIHtpZDogXCJsaWdodGNvcmQtNVwiLCBpbmZvOiBcIkVuYWJsZSBMaWdodGNvcmQncyBzZXJ2ZXJzLiBEaXNhYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgY3VzdG9tIGJhZGdlcy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogZmFsc2UsIGNhdDogXCJsaWdodGNvcmRcIiwgY2F0ZWdvcnk6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgXCJEaXNhYmxlIHR5cGluZ1wiOiAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTdcIiwgaW5mbzogXCJEb24ndCBsZXQgb3RoZXIgc2VlIHlvdSdyZSB0eXBpbmcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwifSxcclxuICAgIFwiTGlnaHRjb3JkIFRhYnNcIjogICAgICAgICAgICAge2lkOiBcImxpZ2h0Y29yZC04XCIsIGluZm86IFwiQWxsb3dzIHlvdSB0byBsYXVuY2ggbXVsdGlwbGUgaW5zdGFuY2VzIG9mIExpZ2h0Y29yZCBpbiB0aGUgc2FtZSB3aW5kb3cuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IHRydWV9LFxyXG4gICAgXCJVc2UgTm90aWZpY2F0aW9uIFNoaW1cIjogICAgICB7aWQ6IFwibGlnaHRjb3JkLTEwXCIsIGluZm86IFwiQmFzaWNhbGx5IGRvbid0IHVzZSBXaW5kb3dzJ3MgTm90aWZpY2F0aW9ucy5cIiwgaW1wbGVtZW50ZWQ6IHRydWUsIGhpZGRlbjogcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJ3aW4zMlwiLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIkxpZ2h0Y29yZFwiLCBleHBlcmltZW50YWw6IGZhbHNlfSxcclxuXHJcbiAgICAvKiogTGlnaHRjb3JkIFdpbmRvdyAqL1xyXG4gICAgXCJBbHdheXMtb24tVG9wXCI6ICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLTNcIiwgaW5mbzogXCJFbmFibGUgdGhlIHdpbmRvdydzIEFsd2F5cy1vbi1Ub3AgbW9kZSwgd2hlcmUgTGlnaHRjb3JkIHN0YXlzIG9uIHRvcCBvZiBvdGhlciBhcHBsaWNhdGlvbnMuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFwiTm8gV2luZG93IEJvdW5kc1wiOiAgICAgICAgICAge2lkOiBcIm5vX3dpbmRvd19ib3VuZFwiLCBpbmZvOiBcIkRpc2FibGUgV2luZG93IEJvdW5kcy4gQ2FuIGJlIHVzZWZ1bCBpZiB5b3UgdXNlIGEgd2luZG93IG1hbmFnZXIuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IHByb2Nlc3MucGxhdGZvcm0gIT09IFwibGludXhcIiwgY2F0OiBcImxpZ2h0Y29yZFwiLCBjYXRlZ29yeTogXCJXaW5kb3dcIn0sXHJcbiAgICBcIkVuYWJsZSBHbGFzc3Ryb25cIjogICAgICAgICAgIHtpZDogXCJlbmFibGVfZ2xhc3N0cm9uXCIsIGluZm86IFwiRW5hYmxlIEdsYXNzdHJvbi4gSWYgeW91J3JlIG5vdCB1c2luZyB0cmFuc3BhcmVudCB0aGVtZXMsIHRoaXMgY2FuIHJlZHVjZSBsYWcuXCIsIGltcGxlbWVudGVkOiB0cnVlLCBoaWRkZW46IGZhbHNlLCBjYXQ6IFwibGlnaHRjb3JkXCIsIGNhdGVnb3J5OiBcIldpbmRvd1wifSxcclxuICAgIFxyXG4gICAgLyoqIFJpY2hQcmVzZW5jZSAqL1xyXG4gICAgXCJFbmFibGVcIjogICAgICAgICAgICAgICAgICAgICB7aWQ6IFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIiwgaW5mbzogXCJFbmFibGUgUmljaFByZXNlbmNlIGJlbG93LlwiLCBpbXBsZW1lbnRlZDogdHJ1ZSwgaGlkZGVuOiBmYWxzZSwgY2F0OiBcInN0YXR1c1wifVxyXG59O1xyXG5cclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRDb29raWUgPSB7XHJcbiAgICBcImJkYS1ncy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy0yXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtM1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLTRcIjogZmFsc2UsXHJcbiAgICBcImJkYS1ncy01XCI6IHRydWUsXHJcbiAgICBcImJkYS1ncy02XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZ3MtN1wiOiBmYWxzZSxcclxuICAgIFwiYmRhLWdzLThcIjogZmFsc2UsXHJcbiAgICBcImJkYS1lcy0wXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0xXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy0yXCI6IHRydWUsXHJcbiAgICBcImJkYS1lcy00XCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtNlwiOiB0cnVlLFxyXG4gICAgXCJiZGEtZXMtN1wiOiB0cnVlLFxyXG4gICAgXCJiZGEtZ3MtYlwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWVzLThcIjogdHJ1ZSxcclxuICAgIFwiYmRhLWRjLTBcIjogZmFsc2UsXHJcbiAgICBcImJkYS1jc3MtMFwiOiBmYWxzZSxcclxuICAgIFwiYmRhLWNzcy0xXCI6IGZhbHNlLFxyXG4gICAgXCJiZGEtZXMtOVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLWRtLTFcIjogZmFsc2UsXHJcbiAgICBcImZvcmstcHMtMVwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTJcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy0zXCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtNFwiOiB0cnVlLFxyXG4gICAgXCJmb3JrLXBzLTVcIjogdHJ1ZSxcclxuICAgIFwiZm9yay1wcy02XCI6IHRydWUsXHJcbiAgICBcImZvcmstcHMtN1wiOiBmYWxzZSxcclxuICAgIFwiZm9yay1lcy0yXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLWVzLTNcIjogdHJ1ZSxcclxuICAgIFwiZm9yay13cC0xXCI6IGZhbHNlLFxyXG4gICAgXCJmb3JrLXdwLTJcIjogZmFsc2UsXHJcbiAgICBcImZvcmstYmV0YVwiOiB0cnVlLFxyXG4gICAgXCJsaWdodGNvcmQtMVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTJcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLXByZXNlbmNlLTFcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC0zXCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtNFwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTVcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLTZcIjogdHJ1ZSxcclxuICAgIFwibGlnaHRjb3JkLTdcIjogZmFsc2UsXHJcbiAgICBcImxpZ2h0Y29yZC04XCI6IGZhbHNlLFxyXG4gICAgXCJsaWdodGNvcmQtOVwiOiBmYWxzZSxcclxuICAgIFwibGlnaHRjb3JkLTEwXCI6IGZhbHNlLFxyXG4gICAgXCJub193aW5kb3dfYm91bmRcIjogZmFsc2UsXHJcbn07XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IHNldHRpbmdzQ29va2llID0ge307XHJcblxyXG5leHBvcnQgY29uc3Qgc2V0dGluZ3NSUEMgPSB7fTtcclxuZXhwb3J0IGNvbnN0IGRlZmF1bHRSUEMgPSB7XHJcbiAgICBcIm5hbWVcIjogXCJMaWdodGNvcmRcIixcclxuICAgIFwiYXBwbGljYXRpb25faWRcIjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIixcclxuICAgIFwic3RhdGVcIjogXCJMaWdodGNvcmQgQ2xpZW50XCIsXHJcbiAgICBcImRldGFpbHNcIjogXCJCcm93c2luZyBEaXNjb3JkXCIsXHJcbiAgICBcInRpbWVzdGFtcHMuc3RhcnRcIjogRGF0ZS5ub3coKSxcclxuICAgIFwiYXNzZXRzLnNtYWxsXCI6IG51bGwsXHJcbiAgICBcImFzc2V0cy5sYXJnZVwiOiBcIjcxMjMyMzgyMTAzNzY4Mjc5MVwiXHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBiZHBsdWdpbkVycm9ycyA9IFtdO1xyXG5leHBvcnQgY29uc3QgYmR0aGVtZUVycm9ycyA9IFtdOyAvLyBkZWZpbmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XHJcblxyXG5leHBvcnQgY29uc3QgYmRDb25maWcgPSBPYmplY3QuY3JlYXRlKEJldHRlckRpc2NvcmRDb25maWcpO1xyXG5cclxuZXhwb3J0IGNvbnN0IGJkdGhlbWVzID0ge307XHJcbmV4cG9ydCBjb25zdCBiZHBsdWdpbnMgPSB7fTtcclxuXHJcbmV4cG9ydCBjb25zdCBwbHVnaW5Db29raWUgPSB7fTtcclxuZXhwb3J0IGNvbnN0IHRoZW1lQ29va2llID0ge307IiwiaW1wb3J0IGxvY2FsU3RvcmFnZUZpeCBmcm9tIFwiLi9sb2NhbFN0b3JhZ2VGaXhcIjtcclxuaW1wb3J0IGxvYWRpbmdJY29uIGZyb20gXCIuL2xvYWRpbmdJY29uXCI7XHJcbmxvY2FsU3RvcmFnZUZpeCgpO1xyXG5sb2FkaW5nSWNvbigpO1xyXG5cclxuY29uc3QgZGVwcmVjYXRlR2xvYmFsID0gKGtleSwgdmFsdWUpID0+IHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csIGtleSwge1xyXG4gICAgICAgIGdldCgpIHtcclxuICAgICAgICAgICAgVXRpbHMud2FybihcIkRlcHJlY2F0ZWQgR2xvYmFsXCIsIGBcIiR7a2V5fVwiIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuIFBsZWFzZSBvbmx5IHVzZSBCZEFwaS5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgIH0pOyAgXHJcbn07XHJcblxyXG5cclxuaW1wb3J0ICogYXMgR2xvYmFscyBmcm9tIFwiLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZ2xvYmFsS2V5cyA9IE9iamVjdC5rZXlzKEdsb2JhbHMpO1xyXG5mb3IgKGNvbnN0IGtleSBvZiBnbG9iYWxLZXlzKSBkZXByZWNhdGVHbG9iYWwoa2V5LCBHbG9iYWxzW2tleV0pO1xyXG5cclxuXHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi9tb2R1bGVzL2JkQXBpXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4vbW9kdWxlcy90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQ2xhc3NOb3JtYWxpemVyIGZyb20gXCIuL21vZHVsZXMvY2xhc3NOb3JtYWxpemVyXCI7XHJcblxyXG5kZXByZWNhdGVHbG9iYWwoXCJCRFYyXCIsIEJEVjIpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJwbHVnaW5Nb2R1bGVcIiwgcGx1Z2luTW9kdWxlKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwidGhlbWVNb2R1bGVcIiwgdGhlbWVNb2R1bGUpO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJVdGlsc1wiLCBVdGlscyk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkJERXZlbnRzXCIsIEJERXZlbnRzKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwic2V0dGluZ3NQYW5lbFwiLCBzZXR0aW5nc1BhbmVsKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiRGF0YVN0b3JlXCIsIERhdGFTdG9yZSk7XHJcbmRlcHJlY2F0ZUdsb2JhbChcIkNvbnRlbnRNYW5hZ2VyXCIsIENvbnRlbnRNYW5hZ2VyKTtcclxuZGVwcmVjYXRlR2xvYmFsKFwiQ2xhc3NOb3JtYWxpemVyXCIsIENsYXNzTm9ybWFsaXplcik7XHJcblxyXG53aW5kb3cuQmRBcGkgPSBCZEFwaTtcclxuXHJcbmltcG9ydCBDb3JlIGZyb20gXCIuL21vZHVsZXMvY29yZVwiO1xyXG5kZXByZWNhdGVHbG9iYWwoXCJtYWluQ29yZVwiLCBDb3JlKTtcclxuXHJcbi8vIFRPRE86IENoYW5nZSBJbml0IG1vZGUgYW5kIHN0b3AgdXNpbmcgQ29yZVdyYXBwZXIuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvcmVXcmFwcGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKGJkQ29uZmlnLCBtZXRob2RzKSB7XHJcbiAgICAgICAgQ29yZS5zZXRDb25maWcoYmRDb25maWcpO1xyXG4gICAgICAgIENvcmUuc2V0TWV0aG9kcyhtZXRob2RzKTtcclxuICAgIH1cclxuXHJcbiAgICBpbml0KCkge1xyXG4gICAgICAgIC8vIGRlcHJlY2F0ZUdsb2JhbChcIm1haW5Db3JlXCIsIHRoaXMubWFpbkNvcmUpO1xyXG4gICAgICAgIENvcmUuaW5pdCgpO1xyXG4gICAgfVxyXG59IiwiZXhwb3J0IGRlZmF1bHQgKCkgPT4ge1xyXG4gICAgY29uc3QgdjJMb2FkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG4gICAgdjJMb2FkZXIuY2xhc3NOYW1lID0gXCJiZC1sb2FkZXJ2MlwiO1xyXG4gICAgdjJMb2FkZXIudGl0bGUgPSBcIkJhbmRhZ2VkQkQgaXMgbG9hZGluZy4uLlwiO1xyXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh2MkxvYWRlcik7XHJcbn07IiwiZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBjb250ZW50V2luZG93R2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MSUZyYW1lRWxlbWVudC5wcm90b3R5cGUsIFwiY29udGVudFdpbmRvd1wiKS5nZXQ7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTElGcmFtZUVsZW1lbnQucHJvdG90eXBlLCBcImNvbnRlbnRXaW5kb3dcIiwge1xyXG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gUmVmbGVjdC5hcHBseShjb250ZW50V2luZG93R2V0dGVyLCB0aGlzLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KGNvbnRlbnRXaW5kb3csIHtcclxuICAgICAgICAgICAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24ob2JqLCBwcm9wKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgPT09IFwibG9jYWxTdG9yYWdlXCIpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBwcm9wKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wID09PSBcImxvY2FsU3RvcmFnZVwiKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBvYmpbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHZhbC5iaW5kKG9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gUHJldmVudCBpbnRlcmNlcHRpb24gYnkgcGF0Y2hpbmcgUmVmbGVjdC5hcHBseSBhbmQgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmRcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZWZsZWN0LCBcImFwcGx5XCIsIHt2YWx1ZTogUmVmbGVjdC5hcHBseSwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCBcImJpbmRcIiwge3ZhbHVlOiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgd3JpdGFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IGZhbHNlfSk7XHJcblxyXG4gICAgY29uc3Qgb09wZW4gPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub3BlbjtcclxuICAgIFhNTEh0dHBSZXF1ZXN0LnByb3RvdHlwZS5vcGVuID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgdXJsID0gYXJndW1lbnRzWzFdO1xyXG4gICAgICAgIGlmICh1cmwudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhcImFwaS93ZWJob29rc1wiKSkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkob09wZW4sIHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9O1xyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFRGSG91ciB7XHJcbiAgICBpbmplY3QyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IHR3ZWx2ZUhvdXIgPSBuZXcgUmVnRXhwKGAoWzAtOV17MSwyfSk6KFswLTldezEsMn0pXFxcXHMoQU18UE0pYCk7XHJcbiAgICAgICAgY29uc3QgY29udmVydCA9IChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNlwiXSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gZGF0YS5yZXR1cm5WYWx1ZS5tYXRjaCh0d2VsdmVIb3VyKTtcclxuICAgICAgICAgICAgaWYgKCFtYXRjaGVkIHx8IG1hdGNoZWQubGVuZ3RoICE9PSA0KSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmIChtYXRjaGVkWzNdID09PSBcIkFNXCIpIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMDBcIiA6IG1hdGNoZWRbMV0ucGFkU3RhcnQoMiwgXCIwXCIpfToke21hdGNoZWRbMl19YCk7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhLnJldHVyblZhbHVlID0gZGF0YS5yZXR1cm5WYWx1ZS5yZXBsYWNlKG1hdGNoZWRbMF0sIGAke21hdGNoZWRbMV0gPT09IFwiMTJcIiA/IFwiMTJcIiA6IHBhcnNlSW50KG1hdGNoZWRbMV0pICsgMTJ9OiR7bWF0Y2hlZFsyXX1gKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBjb25zdCBjYW5jZWxDb3p5ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5UaW1lRm9ybWF0dGVyLCBcImNhbGVuZGFyRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ296eSBtb2RlXHJcbiAgICAgICAgY29uc3QgY2FuY2VsQ29tcGFjdCA9IFV0aWxzLm1vbmtleVBhdGNoKEJEVjIuVGltZUZvcm1hdHRlciwgXCJkYXRlRm9ybWF0XCIsIHthZnRlcjogY29udmVydH0pOyAvLyBDYWxsZWQgaW4gQ29tcGFjdCBtb2RlXHJcbiAgICAgICAgdGhpcy5jYW5jZWwyNEhvdXIgPSAoKSA9PiB7Y2FuY2VsQ296eSgpOyBjYW5jZWxDb21wYWN0KCk7fTsgLy8gQ2FuY2VsIGJvdGhcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmUyNEhvdXIoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsMjRIb3VyKSB0aGlzLmNhbmNlbDI0SG91cigpO1xyXG4gICAgfVxyXG59OyIsImltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5jb25zdCBkaXNwYXRjaGVyID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyXHJcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsICYmIGUuZGVmYXVsdC5oYXNDaGFubmVsKVswXS5kZWZhdWx0XHJcbmxldCByZWxhdGlvblNoaXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5hZGRSZWxhdGlvbnNoaXApWzBdXHJcbmxldCBETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcblxyXG5jb25zdCBibG9ja2VkID0ge31cclxuXHJcbmxldCB1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXHJcbmZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyKCl7XHJcbiAgICBpZih1c2VyTW9kdWxlKXJldHVybiB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgcmV0dXJuIG51bGxcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEFudGlCb3RETSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuYW50aURNID0gdGhpcy5hbnRpRE0uYmluZCh0aGlzKVxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgaWYodGhpcy5lbmFibGVkKXJldHVyblxyXG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWVcclxuXHJcbiAgICAgICAgZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJNRVNTQUdFX0NSRUFURVwiLCB0aGlzLmFudGlETSlcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICBkaXNwYXRjaGVyLnVuc3Vic2NyaWJlKFwiTUVTU0FHRV9DUkVBVEVcIiwgdGhpcy5hbnRpRE0pXHJcbiAgICB9XHJcblxyXG4gICAgYW50aURNKGV2KXtcclxuICAgICAgICBpZighZXYubWVzc2FnZS5hdXRob3IuYm90KXJldHVyblxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkID09PSBnZXRDdXJyZW50VXNlcigpLmlkKVxyXG4gICAgICAgIGlmKGV2Lm1lc3NhZ2UuZ3VpbGRfaWQpcmV0dXJuXHJcblxyXG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSBDaGFubmVsTW9kdWxlLmdldENoYW5uZWwoZXYubWVzc2FnZS5jaGFubmVsX2lkKVxyXG4gICAgICAgIGlmKCFjaGFubmVsKXJldHVybiAvLyBtaWdodCBiZSBicm9rZW5cclxuXHJcbiAgICAgICAgaWYoY2hhbm5lbC50eXBlICE9PSAxKXJldHVyblxyXG5cclxuICAgICAgICBpZihibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSlyZXR1cm4gLy8gSWYgdGhlIHVzZXIgdW5ibG9jayB0aGUgYm90LCBEb24ndCBibG9jayBpdCBhZ2Fpbi5cclxuXHJcbiAgICAgICAgaWYoc2Nhbk1lc3NhZ2UoZXYubWVzc2FnZSkpe1xyXG4gICAgICAgICAgICBibG9ja2VkW2V2Lm1lc3NhZ2UuYXV0aG9yLmlkXSA9IHRydWVcclxuICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGBbQWRCbG9ja106IEJsb2NrZWQgJHtldi5tZXNzYWdlLmF1dGhvci51c2VybmFtZX0jJHtldi5tZXNzYWdlLmF1dGhvci5kaXNjcmltaW5hdG9yfWAsIHtcclxuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcIndhcm5pbmdcIlxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighcmVsYXRpb25TaGlwTW9kdWxlKXJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmFkZFJlbGF0aW9uc2hpcClbMF1cclxuICAgICAgICAgICAgcmVsYXRpb25TaGlwTW9kdWxlLmRlZmF1bHQuYWRkUmVsYXRpb25zaGlwKGV2Lm1lc3NhZ2UuYXV0aG9yLmlkLCB7XHJcbiAgICAgICAgICAgICAgICBsb2NhdGlvbjogXCJDb250ZXh0TWVudVwiXHJcbiAgICAgICAgICAgIH0sIDIpXHJcbiAgICAgICAgICAgIGlmKCFETU1vZHVsZSlETU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmNsb3NlUHJpdmF0ZUNoYW5uZWwpWzBdXHJcbiAgICAgICAgICAgIERNTW9kdWxlLmRlZmF1bHQuY2xvc2VQcml2YXRlQ2hhbm5lbChjaGFubmVsLmlkLCBmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNjYW5NZXNzYWdlKG1lc3NhZ2Upe1xyXG4gICAgaWYoLyhkaXNjb3JkXFwuZ2d8ZGlzY29yZFxcLmNvbVxcL2ludml0ZVxcL3xkaXNjb3JkYXBwXFwuY29tXFwvaW52aXRlXFwvKS9nLnRlc3QobWVzc2FnZS5jb250ZW50KSlyZXR1cm4gdHJ1ZVxyXG4gICAgaWYoRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkLmdnL1wiKSB8fCBFbWJlZHNDb250YWlucyhtZXNzYWdlLCBcImRpc2NvcmQuY29tL2ludml0ZS9cIikgfHwgRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgXCJkaXNjb3JkYXBwLmNvbS9pbnZpdGUvXCIpKXJldHVybiB0cnVlXHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbn1cclxuZnVuY3Rpb24gRW1iZWRzQ29udGFpbnMobWVzc2FnZSwgc2VhcmNoKXtcclxuICAgIGxldCBlbWJlZHMgPSBtZXNzYWdlLmVtYmVkcyB8fCBbXVxyXG4gICAgaWYoZW1iZWRzLmxlbmd0aCA9PT0gMClyZXR1cm4gZmFsc2VcclxuICAgIHJldHVybiBlbWJlZHMubWFwKGVtYmVkID0+IHtcclxuICAgICAgICBpZihlbWJlZC50eXBlICE9PSBcInJpY2hcIilyZXR1cm4gZmFsc2VcclxuICAgICAgICBpZigoZW1iZWQudGl0bGUgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKChlbWJlZC5kZXNjcmlwdGlvbiB8fCBcIlwiKS5pbmNsdWRlcyhzZWFyY2gpKXJldHVybiB0cnVlXHJcbiAgICAgICAgaWYoKChlbWJlZC5mb290ZXIgfHwgXCJcIikgJiYgZW1iZWQuZm9vdGVyLnRleHQgfHwgXCJcIikuaW5jbHVkZXMoc2VhcmNoKSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgIGlmKChlbWJlZC5maWVsZHMgfHwgW10pLm1hcChlID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuaW5jbHVkZXMoc2VhcmNoKSB8fCBlLm5hbWUuaW5jbHVkZXMoc2VhcmNoKVxyXG4gICAgICAgIH0pLmluY2x1ZGVzKHRydWUpKXJldHVybiB0cnVlXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlXHJcblxyXG4gICAgfSkuaW5jbHVkZXModHJ1ZSlcclxufSIsImltcG9ydCB7c2V0dGluZ3NSUEMsIGRlZmF1bHRSUEN9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5cclxuY29uc3QgZGlzcGF0Y2hlciA9IEJETW9kdWxlcy5nZXQobT0+bS5EaXNwYXRjaGVyJiZtLmRlZmF1bHQmJm0uZGVmYXVsdC5kaXNwYXRjaClbMF0uZGVmYXVsdFxyXG5jb25zdCBBY3Rpb25UeXBlcyA9IEJETW9kdWxlcy5nZXQobT0+bS5BY3Rpb25UeXBlcylbMF0uQWN0aW9uVHlwZXNcclxuXHJcbmNvbnN0IHNvY2tldElkID0gXCJsaWdodGNvcmQtc3Bvb2Ytc29ja2V0XCJcclxuY29uc3QgcGlkID0gcHJvY2Vzcy5waWRcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBDdXN0b21SaWNoUHJlc2VuY2Uge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG5cclxuICAgICAgICB0aGlzLmdhbWUgPSBzZXR0aW5nc1JQQ1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgZm9ybWF0ZWRHYW1lKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZCA9PT0gZmFsc2UpcmV0dXJuIG51bGxcclxuICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgbmFtZTogdGhpcy5nYW1lLm5hbWUgfHwgZGVmYXVsdFJQQy5uYW1lLFxyXG4gICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgc3RhdGU6IHRoaXMuZ2FtZS5zdGF0ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICBzbWFsbF9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLnNtYWxsXCJdIHx8IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICB9IDogdW5kZWZpbmVkXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBnYW1lXHJcbiAgICB9XHJcblxyXG4gICAgc2VuZEdhbWUoKXtcclxuICAgICAgICBkaXNwYXRjaGVyLmRpc3BhdGNoKHtcclxuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuTE9DQUxfQUNUSVZJVFlfVVBEQVRFLFxyXG4gICAgICAgICAgICBzb2NrZXRJZCxcclxuICAgICAgICAgICAgcGlkLFxyXG4gICAgICAgICAgICBhY3Rpdml0eTogdGhpcy5mb3JtYXRlZEdhbWVcclxuICAgICAgICB9KSAgIFxyXG4gICAgfVxyXG5cclxuICAgIGVuYWJsZSgpIHtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIGNvbnNvbGUubG9nKFwiRW5hYmxpbmcgY3VzdG9tIFJpY2hQcmVzZW5jZVwiKVxyXG5cclxuICAgICAgICB0aGlzLnNldChzZXR0aW5nc1JQQyB8fCBPYmplY3QuY3JlYXRlKGRlZmF1bHRSUEMpKVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRHYW1lKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCkge1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICBjb25zb2xlLmxvZyhcIkRpc2FibGluZyBjdXN0b20gUmljaFByZXNlbmNlXCIpXHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGZldGNoQXNzZXRzKGFwcGxpY2F0aW9uSWQpe1xyXG4gICAgICAgIGxldCBhc3NldHMgPSBhd2FpdCBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5nZXRBc3NldHMpWzBdLmdldEFzc2V0cyhhcHBsaWNhdGlvbklkKVxyXG4gICAgICAgIGlmKGFzc2V0cy51bmRlZmluZWQgJiYgdHlwZW9mIGFzc2V0cy51bmRlZmluZWQgPT09IFwibnVtYmVyXCIpe1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIEFwcGxpY2F0aW9uXCIpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NldHNcclxuICAgIH1cclxuXHJcbiAgICBzZXQoYWN0aXZpdHkpe1xyXG4gICAgICAgIHRoaXMuZ2FtZSA9IGFjdGl2aXR5XHJcblxyXG4gICAgICAgIHRoaXMuc2VuZEdhbWUoKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtwbHVnaW5Db29raWUsIHRoZW1lQ29va2llLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZSwgc2V0dGluZ3N9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgbWFpbkNvcmUgZnJvbSBcIi4vY29yZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHBsdWdpbk1vZHVsZSBmcm9tIFwiLi9wbHVnaW5Nb2R1bGVcIjtcclxuaW1wb3J0IHRoZW1lTW9kdWxlIGZyb20gXCIuL3RoZW1lTW9kdWxlXCI7XHJcbmltcG9ydCBzZXR0aW5nc1BhbmVsIGZyb20gXCIuL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuY29uc3QgQmRBcGkgPSB7XHJcbiAgICBnZXQgUmVhY3QoKSB7IHJldHVybiBCRFYyLlJlYWN0OyB9LFxyXG4gICAgZ2V0IFJlYWN0RE9NKCkgeyByZXR1cm4gQkRWMi5SZWFjdERvbTsgfSxcclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gQkRWMi5SZWFjdENvbXBvbmVudDt9LFxyXG4gICAgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7cmV0dXJuIFV0aWxzLldpbmRvd0NvbmZpZ0ZpbGU7fSxcclxuICAgIGdldCBzZXR0aW5ncygpIHtyZXR1cm4gc2V0dGluZ3M7fSxcclxuICAgIGdldCBlbW90ZXMoKSB7cmV0dXJuIG51bGx9LCAvLyBkZXByZWNhdGVkLCBkZWxldGVkIGFsbCBlbW90ZXMgZnJvbSBiZXR0ZXJkaXNjb3JkLlxyXG4gICAgZ2V0IHNjcmVlbldpZHRoKCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoLCB3aW5kb3cuaW5uZXJXaWR0aCB8fCAwKTsgfSxcclxuICAgIGdldCBzY3JlZW5IZWlnaHQoKSB7IHJldHVybiBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LCB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgMCk7IH1cclxufTtcclxuXHJcbkJkQXBpLmdldEFsbFdpbmRvd1ByZWZlcmVuY2VzID0gZnVuY3Rpb24oKSB7XHJcbiAgICByZXR1cm4gVXRpbHMuZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKTtcclxufTtcclxuXHJcbkJkQXBpLmdldFdpbmRvd1ByZWZlcmVuY2UgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBVdGlscy5nZXRXaW5kb3dQcmVmZXJlbmNlKGtleSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXRXaW5kb3dQcmVmZXJlbmNlID0gZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xyXG4gICAgcmV0dXJuIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2Uoa2V5LCB2YWx1ZSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkuaW5qZWN0Q1NTID0gZnVuY3Rpb24gKGlkLCBjc3MpIHtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQoaWQpLCBjc3MpO1xyXG59O1xyXG5cclxuLy9DbGVhciBjc3MvcmVtb3ZlIGFueSBlbGVtZW50XHJcbi8vaWQgPSBpZCBvZiBlbGVtZW50XHJcbkJkQXBpLmNsZWFyQ1NTID0gZnVuY3Rpb24gKGlkKSB7XHJcbiAgICBET00ucmVtb3ZlU3R5bGUoRE9NLmVzY2FwZUlEKGlkKSk7XHJcbn07XHJcblxyXG4vL0luamVjdCBDU1MgdG8gZG9jdW1lbnQgaGVhZFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG4vL2NzcyA9IGN1c3RvbSBjc3NcclxuQmRBcGkubGlua0pTID0gZnVuY3Rpb24gKGlkLCB1cmwpIHtcclxuICAgIERPTS5hZGRTY3JpcHQoRE9NLmVzY2FwZUlEKGlkKSwgdXJsKTtcclxufTtcclxuXHJcbi8vQ2xlYXIgY3NzL3JlbW92ZSBhbnkgZWxlbWVudFxyXG4vL2lkID0gaWQgb2YgZWxlbWVudFxyXG5CZEFwaS51bmxpbmtKUyA9IGZ1bmN0aW9uIChpZCkge1xyXG4gICAgRE9NLnJlbW92ZVNjcmlwdChET00uZXNjYXBlSUQoaWQpKTtcclxufTtcclxuXHJcbi8vR2V0IGFub3RoZXIgcGx1Z2luXHJcbi8vbmFtZSA9IG5hbWUgb2YgcGx1Z2luXHJcbkJkQXBpLmdldFBsdWdpbiA9IGZ1bmN0aW9uIChuYW1lKSB7XHJcbiAgICBpZiAoYmRwbHVnaW5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7XHJcbiAgICAgICAgcmV0dXJuIGJkcGx1Z2luc1tuYW1lXS5wbHVnaW47XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbi8vR2V0IEJldHRlckRpc2NvcmQgQ29yZVxyXG5CZEFwaS5nZXRDb3JlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgVXRpbHMud2FybihcIkRlcHJlY2F0aW9uIE5vdGljZVwiLCBgQmRBcGkuZ2V0Q29yZSgpIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuYCk7XHJcbiAgICByZXR1cm4gbWFpbkNvcmU7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBtb2RhbC5cclxuICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50IC0gYSBzdHJpbmcgb2YgdGV4dCB0byBkaXNwbGF5IGluIHRoZSBtb2RhbFxyXG4gKi9cclxuQmRBcGkuYWxlcnQgPSBmdW5jdGlvbiAodGl0bGUsIGNvbnRlbnQpIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwodGl0bGUsIGNvbnRlbnQsIHtjYW5jZWxUZXh0OiBudWxsfSk7XHJcbn07XHJcblxyXG4vKipcclxuICogU2hvd3MgYSBnZW5lcmljIGJ1dCB2ZXJ5IGN1c3RvbWl6YWJsZSBjb25maXJtYXRpb24gbW9kYWwgd2l0aCBvcHRpb25hbCBjb25maXJtIGFuZCBjYW5jZWwgY2FsbGJhY2tzLlxyXG4gKiBAcGFyYW0ge3N0cmluZ30gdGl0bGUgLSB0aXRsZSBvZiB0aGUgbW9kYWxcclxuICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxyXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdIC0gb3B0aW9ucyB0byBtb2RpZnkgdGhlIG1vZGFsXHJcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuZGFuZ2VyPWZhbHNlXSAtIHdoZXRoZXIgdGhlIG1haW4gYnV0dG9uIHNob3VsZCBiZSByZWQgb3Igbm90XHJcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuY2FuY2VsVGV4dD1DYW5jZWxdIC0gdGV4dCBmb3IgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtjYWxsYWJsZX0gW29wdGlvbnMub25Db25maXJtPU5PT1BdIC0gY2FsbGJhY2sgdG8gb2NjdXIgd2hlbiBjbGlja2luZyB0aGUgc3VibWl0IGJ1dHRvblxyXG4gKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cclxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLmtleV0gLSBrZXkgdXNlZCB0byBpZGVudGlmeSB0aGUgbW9kYWwuIElmIG5vdCBwcm92aWRlZCwgb25lIGlzIGdlbmVyYXRlZCBhbmQgcmV0dXJuZWRcclxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUga2V5IHVzZWQgZm9yIHRoaXMgbW9kYWxcclxuICovXHJcbkJkQXBpLnNob3dDb25maXJtYXRpb25Nb2RhbCA9IGZ1bmN0aW9uICh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuc2hvd0NvbmZpcm1hdGlvbk1vZGFsKHRpdGxlLCBjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vU2hvdyB0b2FzdCBhbGVydFxyXG5CZEFwaS5zaG93VG9hc3QgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zID0ge30pIHtcclxuICAgIFV0aWxzLnNob3dUb2FzdChjb250ZW50LCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlID0gZnVuY3Rpb24oZmlsdGVyKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGZpbHRlcik7XHJcbn07XHJcblxyXG4vLyBGaW5kcyBtb2R1bGVcclxuQmRBcGkuZmluZEFsbE1vZHVsZXMgPSBmdW5jdGlvbihmaWx0ZXIpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRBbGwoZmlsdGVyKTtcclxufTtcclxuXHJcbi8vIEZpbmRzIG1vZHVsZVxyXG5CZEFwaS5maW5kTW9kdWxlQnlQcm9wcyA9IGZ1bmN0aW9uKC4uLnByb3BzKSB7XHJcbiAgICByZXR1cm4gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKHByb3BzKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeVByb3RvdHlwZXMgPSBmdW5jdGlvbiguLi5wcm90b3MpIHtcclxuICAgIHJldHVybiBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3RvdHlwZXMocHJvdG9zKTtcclxufTtcclxuXHJcbkJkQXBpLmZpbmRNb2R1bGVCeURpc3BsYXlOYW1lID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUobmFtZSk7XHJcbn07XHJcblxyXG4vLyBHZXRzIHJlYWN0IGluc3RhbmNlXHJcbkJkQXBpLmdldEludGVybmFsSW5zdGFuY2UgPSBmdW5jdGlvbihub2RlKSB7XHJcbiAgICBpZiAoIShub2RlIGluc3RhbmNlb2Ygd2luZG93LmpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgbm9kZSA9IG5vZGVbMF07XHJcbiAgICByZXR1cm4gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKG5vZGUpO1xyXG59O1xyXG5cclxuLy8gR2V0cyBkYXRhXHJcbkJkQXBpLmxvYWREYXRhID0gZnVuY3Rpb24ocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLmdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KTtcclxufTtcclxuXHJcbkJkQXBpLmdldERhdGEgPSBCZEFwaS5sb2FkRGF0YTtcclxuXHJcbi8vIFNldHMgZGF0YVxyXG5CZEFwaS5zYXZlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSwgZGF0YSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5zZXRQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSwgZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5zZXREYXRhID0gQmRBcGkuc2F2ZURhdGE7XHJcblxyXG4vLyBEZWxldGVzIGRhdGFcclxuQmRBcGkuZGVsZXRlRGF0YSA9IGZ1bmN0aW9uKHBsdWdpbk5hbWUsIGtleSkge1xyXG4gICAgcmV0dXJuIERhdGFTdG9yZS5kZWxldGVQbHVnaW5EYXRhKHBsdWdpbk5hbWUsIGtleSk7XHJcbn07XHJcblxyXG4vLyBQYXRjaGVzIG90aGVyIGZ1bmN0aW9uc1xyXG5CZEFwaS5tb25rZXlQYXRjaCA9IGZ1bmN0aW9uKHdoYXQsIG1ldGhvZE5hbWUsIG9wdGlvbnMpIHtcclxuICAgIHJldHVybiBVdGlscy5tb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKTtcclxufTtcclxuXHJcbi8vIEV2ZW50IHdoZW4gZWxlbWVudCBpcyByZW1vdmVkXHJcbkJkQXBpLm9uUmVtb3ZlZCA9IGZ1bmN0aW9uKG5vZGUsIGNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gVXRpbHMub25SZW1vdmVkKG5vZGUsIGNhbGxiYWNrKTtcclxufTtcclxuXHJcbi8vIFdyYXBzIGZ1bmN0aW9uIGluIHRyeS4uY2F0Y2hcclxuQmRBcGkuc3VwcHJlc3NFcnJvcnMgPSBmdW5jdGlvbihtZXRob2QsIG1lc3NhZ2UpIHtcclxuICAgIHJldHVybiBVdGlscy5zdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpO1xyXG59O1xyXG5cclxuLy8gVGVzdHMgZm9yIHZhbGlkIEpTT05cclxuQmRBcGkudGVzdEpTT04gPSBmdW5jdGlvbihkYXRhKSB7XHJcbiAgICByZXR1cm4gVXRpbHMudGVzdEpTT04oZGF0YSk7XHJcbn07XHJcblxyXG5CZEFwaS5pc1BsdWdpbkVuYWJsZWQgPSBmdW5jdGlvbihuYW1lKSB7XHJcbiAgICByZXR1cm4gISFwbHVnaW5Db29raWVbbmFtZV07XHJcbn07XHJcblxyXG5CZEFwaS5pc1RoZW1lRW5hYmxlZCA9IGZ1bmN0aW9uKG5hbWUpIHtcclxuICAgIHJldHVybiAhIXRoZW1lQ29va2llW25hbWVdO1xyXG59O1xyXG5cclxuQmRBcGkuaXNTZXR0aW5nRW5hYmxlZCA9IGZ1bmN0aW9uKGlkKSB7XHJcbiAgICByZXR1cm4gISFzZXR0aW5nc0Nvb2tpZVtpZF07XHJcbn07XHJcblxyXG5CZEFwaS5lbmFibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCB0cnVlKTtcclxufTtcclxuXHJcbkJkQXBpLmRpc2FibGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCBmYWxzZSk7XHJcbn07XHJcblxyXG5CZEFwaS50b2dnbGVTZXR0aW5nID0gZnVuY3Rpb24oaWQpIHtcclxuICAgIHJldHVybiBzZXR0aW5nc1BhbmVsLm9uQ2hhbmdlKGlkLCAhc2V0dGluZ3NDb29raWVbaWRdKTtcclxufTtcclxuXHJcbi8vIEdldHMgZGF0YVxyXG5CZEFwaS5nZXRCRERhdGEgPSBmdW5jdGlvbihrZXkpIHtcclxuICAgIHJldHVybiBEYXRhU3RvcmUuZ2V0QkREYXRhKGtleSk7XHJcbn07XHJcblxyXG4vLyBTZXRzIGRhdGFcclxuQmRBcGkuc2V0QkREYXRhID0gZnVuY3Rpb24oa2V5LCBkYXRhKSB7XHJcbiAgICByZXR1cm4gRGF0YVN0b3JlLnNldEJERGF0YShrZXksIGRhdGEpO1xyXG59O1xyXG5cclxuXHJcblxyXG5jb25zdCBtYWtlQWRkb25BUEkgPSAoY29va2llLCBsaXN0LCBtYW5hZ2VyKSA9PiBuZXcgY2xhc3MgQWRkb25BUEkge1xyXG5cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIG1hbmFnZXIuZm9sZGVyO31cclxuXHJcbiAgICBpc0VuYWJsZWQobmFtZSkge1xyXG4gICAgICAgIHJldHVybiAhIWNvb2tpZVtuYW1lXTtcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUobmFtZSkge1xyXG4gICAgICAgIHJldHVybiBtYW5hZ2VyLmVuYWJsZShuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5kaXNhYmxlKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHRvZ2dsZShuYW1lKSB7XHJcbiAgICAgICAgaWYgKGNvb2tpZVtuYW1lXSkgdGhpcy5kaXNhYmxlKG5hbWUpO1xyXG4gICAgICAgIGVsc2UgdGhpcy5lbmFibGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVsb2FkKG5hbWUpIHtcclxuICAgICAgICByZXR1cm4gbWFuYWdlci5yZWxvYWQobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0KG5hbWUpIHtcclxuICAgICAgICBpZiAobGlzdC5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xyXG4gICAgICAgICAgICBpZiAobGlzdFtuYW1lXS5wbHVnaW4pIHJldHVybiBsaXN0W25hbWVdLnBsdWdpbjtcclxuICAgICAgICAgICAgcmV0dXJuIGxpc3RbbmFtZV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEFsbCgpIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMobGlzdCkubWFwKGsgPT4gdGhpcy5nZXQoaykpLmZpbHRlcihhID0+IGEpO1xyXG4gICAgfVxyXG59O1xyXG5cclxuQmRBcGkuUGx1Z2lucyA9IG1ha2VBZGRvbkFQSShwbHVnaW5Db29raWUsIGJkcGx1Z2lucywgcGx1Z2luTW9kdWxlKTtcclxuQmRBcGkuVGhlbWVzID0gbWFrZUFkZG9uQVBJKHRoZW1lQ29va2llLCBiZHRoZW1lcywgdGhlbWVNb2R1bGUpO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgQmRBcGk7XHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQmRBcGkgPSBCZEFwaSIsIi8qIEJERXZlbnRzICovXHJcbmNvbnN0IEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoXCJldmVudHNcIik7XHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBCREV2ZW50cyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHN1cGVyKClcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuQkRFdmVudHMgPSB0aGlzXHJcbiAgICB9XHJcbiAgICBkaXNwYXRjaChldmVudE5hbWUsIC4uLmFyZ3MpIHt0aGlzLmVtaXQoZXZlbnROYW1lLCAuLi5hcmdzKTt9XHJcbiAgICBvZmYoZXZlbnROYW1lLCBldmVudEFjdGlvbikge3RoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBldmVudEFjdGlvbik7fVxyXG59OyIsIi8qKlxyXG4gKiBDcmVkaXRzIHRvIEBoZWxsYm91bmQxMzM3IG9uIGdpdGh1YiBmb3IgdGhlIGNzc1xyXG4gKi9cclxuXHJcbmltcG9ydCBET01Ub29scyBmcm9tIFwiLi9kb210b29sc1wiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcblxyXG5sZXQgc2VsZWN0b3JzXHJcbmNvbnN0IHJlbW92ZURhID0gVXRpbHMucmVtb3ZlRGFcclxuZnVuY3Rpb24gZ2V0U2VsZWN0b3JzKCl7XHJcbiAgICBsZXQgc3RhbmRhcmRTaWRlYmFyVmlldyA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnN0YW5kYXJkU2lkZWJhclZpZXcpWzBdXHJcbiAgICBpZighc3RhbmRhcmRTaWRlYmFyVmlldylyZXR1cm4gbnVsbFxyXG4gICAgbGV0IGRlZmF1bHRDbGFzc05hbWUgPSByZW1vdmVEYShzdGFuZGFyZFNpZGViYXJWaWV3LnN0YW5kYXJkU2lkZWJhclZpZXcpXHJcbiAgICBsZXQgc2VsZWN0cyA9IFtdXHJcbiAgICBsZXQgdXNlclNldHRpbmdzQWNjb3VudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnVzZXJTZXR0aW5nc0FjY291bnQpWzBdXHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IEJETW9kdWxlcy5nZXQoZSA9PiB0eXBlb2YgZS5jaGlsZHJlbiA9PT0gXCJzdHJpbmdcIilbMF1cclxuICAgIHNlbGVjdHMucHVzaChgI2FwcC1tb3VudCAuJHtkZWZhdWx0Q2xhc3NOYW1lfSAucGF5bWVudC1pbmZvIC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlc2NyaXB0aW9uICYmIHR5cGVvZiBlLmRlc2NyaXB0aW9uID09PSBcInN0cmluZ1wiICYmIGUuZGVzY3JpcHRpb24uaW5jbHVkZXMoXCJmb3JtVGV4dFwiKSlbMF0uZGVzY3JpcHRpb24pfWApXHJcbiAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUucGF5bWVudFNvdXJjZVJvdylbMF0ucGF5bWVudFNvdXJjZVJvdyl9IC4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnN1YlRleHQgJiYgZS5kZXNjcmlwdGlvbldyYXBwZXIpWzBdLnN1YlRleHQpfWApXHJcbiAgICBpZih1c2VyU2V0dGluZ3NBY2NvdW50KXtcclxuICAgICAgICBzZWxlY3RzLnB1c2goYCNhcHAtbW91bnQgLiR7ZGVmYXVsdENsYXNzTmFtZX0gLiR7cmVtb3ZlRGEodXNlclNldHRpbmdzQWNjb3VudC51c2VyU2V0dGluZ3NBY2NvdW50KX0gZGl2Om50aC1jaGlsZCgyKT5kaXY6bnRoLWNoaWxkKDIpPi4ke3JlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLnZpZXdCb2R5KVswXS52aWV3Qm9keSl9YClcclxuICAgICAgICBzZWxlY3RzLnB1c2goYC4ke3JlbW92ZURhKHVzZXJTZXR0aW5nc0FjY291bnQudXNlclNldHRpbmdzU2VjdXJpdHkpfSAuJHtyZW1vdmVEYShjaGlsZHJlbi5jaGlsZHJlbil9ID4gZGl2Om50aC1jaGlsZCgyKWApXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhzZWxlY3RzKVxyXG4gICAgcmV0dXJuIHNlbGVjdHNcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIEJsdXJQcml2YXRlIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgIH1cclxuXHJcbiAgICBlbmFibGUoKXtcclxuICAgICAgICBpZih0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIHNlbGVjdG9ycyA9IHNlbGVjdG9ycyB8fCBnZXRTZWxlY3RvcnMoKVxyXG5cclxuICAgICAgICBpZighc2VsZWN0b3JzKWNvbnNvbGUuZXJyb3IobmV3IEVycm9yKFwiQ291bGRuJ3QgZmluZCBzZWxlY3RvcnMgdG8gYmx1ciBwZXJzb25uYWwgaW5mb3JtYXRpb25zLlwiKSlcclxuICAgICAgICBET01Ub29scy5hZGRTdHlsZShcImJsdXJQcml2YXRlXCIsIGBcclxuJHtzZWxlY3RvcnMuam9pbihcIiwgXCIpfSB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDg1LC42OCwuNTMpO1xyXG4gICAgZmlsdGVyOiBibHVyKDRweCk7XHJcbiAgICBvcGFjaXR5OiAuODtcclxufVxyXG5cclxuJHtzZWxlY3RvcnMubWFwKGUgPT4gZStcIjpob3ZlclwiKS5qb2luKFwiLCBcIil9ICB7XHJcbiAgICB0cmFuc2l0aW9uOiBhbGwgMTUwbXMgY3ViaWMtYmV6aWVyKC41NSwuMDksLjY4LC41Myk7XHJcbiAgICBmaWx0ZXI6IG5vbmU7XHJcbiAgICBvcGFjaXR5OiAxO1xyXG59YClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgaWYoIXRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIERPTVRvb2xzLnJlbW92ZVN0eWxlKFwiYmx1clByaXZhdGVcIilcclxuICAgIH1cclxufSIsImltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5cclxuY29uc3Qgbm9ybWFsaXplZFByZWZpeCA9IFwiZGFcIjtcclxuY29uc3QgcmFuZENsYXNzID0gbmV3IFJlZ0V4cChgXig/ISR7bm9ybWFsaXplZFByZWZpeH0tKSgoPzpbQS1aYS16XXxbMC05XXwtKSspLSg/OltBLVphLXpdfFswLTldfC18Xyl7Nn0kYCk7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ2xhc3NOb3JtYWxpemVyIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkNsYXNzTm9ybWFsaXplciA9IHRoaXNcclxuICAgIH1cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1BhdGNoZWQpIHJldHVybjtcclxuICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZXMoV2VicGFja01vZHVsZXMuZmluZEFsbCh0aGlzLm1vZHVsZUZpbHRlci5iaW5kKHRoaXMpKSk7XHJcbiAgICAgICAgdGhpcy5yZXZlcnRFbGVtZW50KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIjYXBwLW1vdW50XCIpKTtcclxuICAgICAgICB0aGlzLmhhc1BhdGNoZWQgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBpZiAodGhpcy5oYXNQYXRjaGVkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5wYXRjaENsYXNzTW9kdWxlcyhXZWJwYWNrTW9kdWxlcy5maW5kQWxsKHRoaXMubW9kdWxlRmlsdGVyLmJpbmQodGhpcykpKTtcclxuICAgICAgICB0aGlzLm5vcm1hbGl6ZUVsZW1lbnQoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNhcHAtbW91bnRcIikpO1xyXG4gICAgICAgIHRoaXMuaGFzUGF0Y2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5wYXRjaERPTU1ldGhvZHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnBhdGNoQ2xhc3NNb2R1bGUobm9ybWFsaXplZFByZWZpeCwgbW9kdWxlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdW5wYXRjaENsYXNzTW9kdWxlcyhtb2R1bGVzKSB7XHJcbiAgICAgICAgZm9yIChjb25zdCBtb2R1bGUgb2YgbW9kdWxlcykge1xyXG4gICAgICAgICAgICB0aGlzLnVucGF0Y2hDbGFzc01vZHVsZShub3JtYWxpemVkUHJlZml4LCBtb2R1bGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzaG91bGRJZ25vcmUodmFsdWUpIHtcclxuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmVuZHNXaXRoKFwicHhcIikgfHwgdmFsdWUuZW5kc1dpdGgoXCJjaFwiKSB8fCB2YWx1ZS5lbmRzV2l0aChcImVtXCIpIHx8IHZhbHVlLmVuZHNXaXRoKFwibXNcIikpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKFwibGF5ZXJDb250YWluZXItXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcIiNcIikgJiYgKHZhbHVlLmxlbmd0aCA9PSA3IHx8IHZhbHVlLmxlbmd0aCA9PSA0KSkgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKFwiY2FsYyhcIikgfHwgdmFsdWUuaW5jbHVkZXMoXCJyZ2JhXCIpKSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbW9kdWxlRmlsdGVyKG1vZHVsZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgbW9kdWxlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkobW9kdWxlKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmIChtb2R1bGUuX19lc01vZHVsZSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGlmICghT2JqZWN0LmtleXMobW9kdWxlKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBmb3IgKGNvbnN0IGJhc2VDbGFzc05hbWUgaW4gbW9kdWxlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbW9kdWxlW2Jhc2VDbGFzc05hbWVdO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZElnbm9yZSh2YWx1ZSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAodmFsdWUuc3BsaXQoXCItXCIpLmxlbmd0aCA9PT0gMSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICBpZiAoIXJhbmRDbGFzcy50ZXN0KHZhbHVlLnNwbGl0KFwiIFwiKVswXSkpIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBub3JtYWxDbGFzcyBvZiBjbGFzc0xpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbm9ybWFsQ2xhc3MubWF0Y2gocmFuZENsYXNzKTtcclxuICAgICAgICAgICAgICAgIGlmICghbWF0Y2ggfHwgIW1hdGNoLmxlbmd0aCB8fCBtYXRjaC5sZW5ndGggPCAyKSBjb250aW51ZTsgLy8gU2hvdWxkbid0IGV2ZXIgaGFwcGVuIHNpbmNlIHRoZXkgcGFzc2VkIHRoZSBtb2R1bGVGaWx0ZXIsIGJ1dCB5b3UgbmV2ZXIga25vd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgY2FtZWxDYXNlID0gbWF0Y2hbMV0uc3BsaXQoXCItXCIpLm1hcCgocywgaSkgPT4gaSA/IHNbMF0udG9VcHBlckNhc2UoKSArIHMuc2xpY2UoMSkgOiBzKS5qb2luKFwiXCIpO1xyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSArPSBgICR7Y29tcG9uZW50TmFtZX0tJHtjYW1lbENhc2V9YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1bnBhdGNoQ2xhc3NNb2R1bGUoY29tcG9uZW50TmFtZSwgY2xhc3NOYW1lcykge1xyXG4gICAgICAgIGZvciAoY29uc3QgYmFzZUNsYXNzTmFtZSBpbiBjbGFzc05hbWVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlKHZhbHVlKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGxldCBuZXdTdHJpbmcgPSBcIlwiO1xyXG4gICAgICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdChcIiBcIik7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9ybWFsQ2xhc3Mgb2YgY2xhc3NMaXN0KSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobm9ybWFsQ2xhc3Muc3RhcnRzV2l0aChgJHtjb21wb25lbnROYW1lfS1gKSkgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBuZXdTdHJpbmcgKz0gYCAke25vcm1hbENsYXNzfWA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2xhc3NOYW1lc1tiYXNlQ2xhc3NOYW1lXSA9IG5ld1N0cmluZy50cmltKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5vcm1hbGl6ZUVsZW1lbnQoZWxlbWVudCkge1xyXG4gICAgICAgIGlmICghKGVsZW1lbnQgaW5zdGFuY2VvZiBFbGVtZW50KSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGNsYXNzZXMgPSBlbGVtZW50LmNsYXNzTGlzdDtcclxuICAgICAgICBmb3IgKGxldCBjID0gMCwgY2xlbiA9IGNsYXNzZXMubGVuZ3RoOyBjIDwgY2xlbjsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmICghcmFuZENsYXNzLnRlc3QoY2xhc3Nlc1tjXSkpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IGNsYXNzZXNbY10ubWF0Y2gocmFuZENsYXNzKVsxXTtcclxuICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3MgPSBtYXRjaC5zcGxpdChcIi1cIikubWFwKChzLCBpKSA9PiBpID8gc1swXS50b1VwcGVyQ2FzZSgpICsgcy5zbGljZSgxKSA6IHMpLmpvaW4oXCJcIik7XHJcbiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChgJHtub3JtYWxpemVkUHJlZml4fS0ke25ld0NsYXNzfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGVsZW1lbnQuY2hpbGRyZW4pIHRoaXMubm9ybWFsaXplRWxlbWVudChjaGlsZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJ0RWxlbWVudChlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnQpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGRyZW4gJiYgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50LmNoaWxkcmVuWzBdKTtcclxuICAgICAgICBpZiAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcpIHRoaXMucmV2ZXJ0RWxlbWVudChlbGVtZW50Lm5leHRFbGVtZW50U2libGluZyk7XHJcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGVsZW1lbnQuY2xhc3NMaXN0O1xyXG4gICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjbGFzc2VzLmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgIGlmIChjbGFzc2VzW2NdLnN0YXJ0c1dpdGgoYCR7bm9ybWFsaXplZFByZWZpeH0tYCkpIHRvUmVtb3ZlLnB1c2goY2xhc3Nlc1tjXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSguLi50b1JlbW92ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcGF0Y2hET01NZXRob2RzKCkge1xyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5zID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5jb250YWlucztcclxuICAgICAgICBET01Ub2tlbkxpc3QucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24odG9rZW4pIHtcclxuICAgICAgICAgICAgLy8gY29uc3QgdG9rZW5zID0gdG9rZW4uc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gUmVmbGVjdC5hcHBseShjb250YWlucywgdGhpcywgW3Rva2VuLnNwbGl0KFwiIFwiKVswXV0pO1xyXG4gICAgICAgICAgICAvLyByZXR1cm4gdG9rZW5zLmV2ZXJ5KHQgPT4gY29udGFpbnMuY2FsbCh0aGlzLCB0KSk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgY29uc3QgYWRkID0gRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQ7XHJcbiAgICAgICAgRE9NVG9rZW5MaXN0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiguLi50b2tlbnMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgdCA9IDA7IHQgPCB0b2tlbnMubGVuZ3RoOyB0KyspIHtcclxuICAgICAgICAgICAgICAgIHRva2Vuc1t0XSA9IHRva2Vuc1t0XS5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuYXBwbHkoYWRkLCB0aGlzLCB0b2tlbnMpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGNvbnN0IHJlbW92ZSA9IERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlO1xyXG4gICAgICAgIERPTVRva2VuTGlzdC5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oLi4udG9rZW5zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdG9rZW5zLmxlbmd0aDsgdCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0b2tlbnNbdF0gPSB0b2tlbnNbdF0uc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBSZWZsZWN0LmFwcGx5KHJlbW92ZSwgdGhpcywgdG9rZW5zKTtcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxufTsiLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29sb3JlZFRleHQge1xyXG4gICAgaW5qZWN0Q29sb3JlZFRleHQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FuY2VsQ29sb3JlZFRleHQpIHJldHVybjtcclxuICAgICAgICBpZiAoIUJEVjIuTWVzc2FnZUNvbXBvbmVudCkgcmV0dXJuO1xyXG5cclxuICAgICAgICB0aGlzLmNhbmNlbENvbG9yZWRUZXh0ID0gVXRpbHMubW9ua2V5UGF0Y2goQkRWMi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2JlZm9yZTogKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICAgICAgaWYgKCFwcm9wcyB8fCAhcHJvcHMuY2hpbGRyZW5NZXNzYWdlQ29udGVudCkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlQ29udGVudCA9IHByb3BzLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VDb250ZW50LnR5cGUgfHwgIW1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSB8fCBtZXNzYWdlQ29udGVudC50eXBlLnR5cGUuZGlzcGxheU5hbWUgIT0gXCJNZXNzYWdlQ29udGVudFwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVHlwZSA9IG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZTtcclxuICAgICAgICAgICAgaWYgKG9yaWdpbmFsVHlwZS5fX29yaWdpbmFsTWV0aG9kKSByZXR1cm47IC8vIERvbid0IHBhdGNoIGFnYWluXHJcbiAgICAgICAgICAgIG1lc3NhZ2VDb250ZW50LnR5cGUudHlwZSA9IGZ1bmN0aW9uKHByb3BzKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsVHlwZShwcm9wcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlQ29sb3IgPSBzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy03XCJdID8gcHJvcHMubWVzc2FnZS5jb2xvclN0cmluZyB8fCBcIlwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbHVlLnByb3BzLnN0eWxlID0ge2NvbG9yOiByb2xlQ29sb3J9O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgbWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbFR5cGU7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVzc2FnZUNvbnRlbnQudHlwZS50eXBlLCBvcmlnaW5hbFR5cGUpO1xyXG4gICAgICAgIH19KTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVDb2xvcmVkVGV4dCgpIHtcclxuICAgICAgICBsZXQgY2xhc3NOYW1lTWFya3VwID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFya3VwKVswXS5tYXJrdXBcclxuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLlwiK2NsYXNzTmFtZU1hcmt1cC5zcGxpdChcIiBcIilbMF0pLmZvckVhY2goZWxlbSA9PiB7XHJcbiAgICAgICAgICAgIGVsZW0uc3R5bGUuc2V0UHJvcGVydHkoXCJjb2xvclwiLCBcIlwiKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTsiLCJpbXBvcnQge2JkQ29uZmlnLCBiZHBsdWdpbnMsIGJkdGhlbWVzLCBzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IGRhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IHsgZW5jcnlwdFNldHRpbmdzQ2FjaGUsIGRlY3J5cHRTZXR0aW5nc0NhY2hlLCBwcm9jZXNzRmlsZSB9IGZyb20gXCIuL3BsdWdpbkNlcnRpZmllclwiO1xyXG5cclxuY29uc3QgcGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpO1xyXG5jb25zdCBmcyA9IHJlcXVpcmUoXCJmc1wiKTtcclxuY29uc3QgTW9kdWxlID0gcmVxdWlyZShcIm1vZHVsZVwiKS5Nb2R1bGU7XHJcbk1vZHVsZS5nbG9iYWxQYXRocy5wdXNoKHBhdGgucmVzb2x2ZShyZXF1aXJlKFwiZWxlY3Ryb25cIikucmVtb3RlLmFwcC5nZXRBcHBQYXRoKCksIFwibm9kZV9tb2R1bGVzXCIpKTtcclxuY2xhc3MgTWV0YUVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xyXG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xyXG4gICAgICAgIHRoaXMubmFtZSA9IFwiTWV0YUVycm9yXCI7XHJcbiAgICB9XHJcbn1cclxuY29uc3Qgb3JpZ2luYWxKU1JlcXVpcmUgPSBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuanNcIl07XHJcbmNvbnN0IG9yaWdpbmFsQ1NTUmVxdWlyZSA9IE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPyBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuY3NzXCJdIDogKCkgPT4ge3JldHVybiBudWxsO307XHJcbmNvbnN0IHNwbGl0UmVnZXggPSAvW15cXFNcXHJcXG5dKj8oPzpcXHJcXG58XFxuKVteXFxTXFxyXFxuXSo/XFwqW15cXFNcXHJcXG5dPy87XHJcbmNvbnN0IGVzY2FwZWRBdFJlZ2V4ID0gL15cXFxcQC87XHJcblxyXG5leHBvcnQgbGV0IGFkZG9uQ2FjaGUgPSB7fVxyXG5cclxubGV0IGhhc1BhdGNoZWQgPSBmYWxzZVxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgQ29udGVudE1hbmFnZXIge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMudGltZUNhY2hlID0ge307XHJcbiAgICAgICAgdGhpcy53YXRjaGVycyA9IHt9O1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoRXh0ZW5zaW9ucygpe1xyXG4gICAgICAgIGlmKGhhc1BhdGNoZWQpcmV0dXJuXHJcbiAgICAgICAgaGFzUGF0Y2hlZCA9IHRydWVcclxuICAgICAgICBNb2R1bGUuX2V4dGVuc2lvbnNbXCIuanNcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwicGx1Z2luXCIpO1xyXG4gICAgICAgIE1vZHVsZS5fZXh0ZW5zaW9uc1tcIi5jc3NcIl0gPSB0aGlzLmdldENvbnRlbnRSZXF1aXJlKFwidGhlbWVcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHBsdWdpbnNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3BsdWdpbnNGb2xkZXIgfHwgKHRoaXMuX3BsdWdpbnNGb2xkZXIgPSBmcy5yZWFscGF0aFN5bmMocGF0aC5yZXNvbHZlKGJkQ29uZmlnLmRhdGFQYXRoICsgXCJwbHVnaW5zL1wiKSkpO31cclxuICAgIGdldCB0aGVtZXNGb2xkZXIoKSB7cmV0dXJuIHRoaXMuX3RoZW1lc0ZvbGRlciB8fCAodGhpcy5fdGhlbWVzRm9sZGVyID0gZnMucmVhbHBhdGhTeW5jKHBhdGgucmVzb2x2ZShiZENvbmZpZy5kYXRhUGF0aCArIFwidGhlbWVzL1wiKSkpO31cclxuXHJcbiAgICBsb2FkQWRkb25DZXJ0aWZpZXJDYWNoZSgpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIpICE9PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShcInt9XCIpKVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0cnl7XHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlID0gSlNPTi5wYXJzZShkZWNyeXB0U2V0dGluZ3NDYWNoZShkYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwiUGx1Z2luQ2VydGlmaWVySGFzaGVzXCIpKSlcclxuICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShcInt9XCIpKVxyXG4gICAgICAgICAgICAgICAgYWRkb25DYWNoZSA9IHt9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgT2JqZWN0LmtleXMoYWRkb25DYWNoZSlcclxuICAgICAgICAuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgaWYoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSlyZXR1cm4gZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG5cclxuICAgICAgICAgICAgbGV0IHByb3BzID0gW3tcclxuICAgICAgICAgICAgICAgIGtleTogXCJ0aW1lc3RhbXBcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAga2V5OiBcInJlc3VsdFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJvYmplY3RcIlxyXG4gICAgICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgICAgICBrZXk6IFwiaGFzaFwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIlxyXG4gICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICBmb3IobGV0IHByb3Agb2YgcHJvcHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoIShwcm9wLmtleSBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3Aua2V5XSAhPT0gcHJvcC50eXBlKXtcclxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtrZXldXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYodmFsdWUuaGFzaCAhPT0ga2V5KXtcclxuICAgICAgICAgICAgICAgIGRlbGV0ZSBhZGRvbkNhY2hlW2tleV1cclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHZhbHVlLnJlc3VsdC5zdXNwZWN0KXsgLy8gcmVmZXRjaCBmcm9tIHJlbW90ZSB0byBiZSBzdXJlIHlvdSdyZSB1cCB0byBkYXRlLlxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGFkZG9uQ2FjaGVba2V5XVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgfVxyXG5cclxuICAgIHNhdmVBZGRvbkNhY2hlKCl7XHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcIlBsdWdpbkNlcnRpZmllckhhc2hlc1wiLCBlbmNyeXB0U2V0dGluZ3NDYWNoZShKU09OLnN0cmluZ2lmeShhZGRvbkNhY2hlKSkpXHJcbiAgICB9XHJcblxyXG4gICAgd2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSBjb250ZW50VHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdID0gZnMud2F0Y2goYmFzZUZvbGRlciwge3BlcnNpc3RlbnQ6IGZhbHNlfSwgYXN5bmMgKGV2ZW50VHlwZSwgZmlsZW5hbWUpID0+IHtcclxuICAgICAgICAgICAgaWYgKCFldmVudFR5cGUgfHwgIWZpbGVuYW1lIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZShyID0+IHNldFRpbWVvdXQociwgNTApKTtcclxuICAgICAgICAgICAgdHJ5IHtmcy5zdGF0U3luYyhwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChlcnIuY29kZSAhPT0gXCJFTk9FTlRcIikgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXTtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgcmV0dXJuIHBsdWdpbk1vZHVsZS51bmxvYWRQbHVnaW4oZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoZW1lTW9kdWxlLnVubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpLmlzRmlsZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gZnMuc3RhdFN5bmMocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLm10aW1lIHx8ICFzdGF0cy5tdGltZS5nZXRUaW1lKCkpIHJldHVybjtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZihzdGF0cy5tdGltZS5nZXRUaW1lKCkpICE9PSBcIm51bWJlclwiKSByZXR1cm47XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbWVDYWNoZVtmaWxlbmFtZV0gPT0gc3RhdHMubXRpbWUuZ2V0VGltZSgpKSByZXR1cm47XHJcbiAgICAgICAgICAgIHRoaXMudGltZUNhY2hlW2ZpbGVuYW1lXSA9IHN0YXRzLm10aW1lLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKGV2ZW50VHlwZSA9PSBcInJlbmFtZVwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXNQbHVnaW4pIGF3YWl0IHBsdWdpbk1vZHVsZS5sb2FkUGx1Z2luKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgYXdhaXQgdGhlbWVNb2R1bGUubG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZXZlbnRUeXBlID09IFwiY2hhbmdlXCIpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1BsdWdpbikgYXdhaXQgcGx1Z2luTW9kdWxlLnJlbG9hZFBsdWdpbihmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGF3YWl0IHRoZW1lTW9kdWxlLnJlbG9hZFRoZW1lKGZpbGVuYW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVud2F0Y2hDb250ZW50KGNvbnRlbnRUeXBlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLndhdGNoZXJzW2NvbnRlbnRUeXBlXSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdLmNsb3NlKCk7XHJcbiAgICAgICAgZGVsZXRlIHRoaXMud2F0Y2hlcnNbY29udGVudFR5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGV4dHJhY3RNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBmaXJzdExpbmUgPSBjb250ZW50LnNwbGl0KFwiXFxuXCIpWzBdO1xyXG4gICAgICAgIGNvbnN0IGhhc09sZE1ldGEgPSBmaXJzdExpbmUuaW5jbHVkZXMoXCIvL01FVEFcIik7XHJcbiAgICAgICAgaWYgKGhhc09sZE1ldGEpIHJldHVybiB0aGlzLnBhcnNlT2xkTWV0YShjb250ZW50KTtcclxuICAgICAgICBjb25zdCBoYXNOZXdNZXRhID0gZmlyc3RMaW5lLmluY2x1ZGVzKFwiLyoqXCIpO1xyXG4gICAgICAgIGlmIChoYXNOZXdNZXRhKSByZXR1cm4gdGhpcy5wYXJzZU5ld01ldGEoY29udGVudCk7XHJcbiAgICAgICAgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICB9XHJcblxyXG4gICAgcGFyc2VPbGRNZXRhKGNvbnRlbnQpIHtcclxuICAgICAgICBjb25zdCBtZXRhID0gY29udGVudC5zcGxpdChcIlxcblwiKVswXTtcclxuICAgICAgICBjb25zdCByYXdNZXRhID0gbWV0YS5zdWJzdHJpbmcobWV0YS5sYXN0SW5kZXhPZihcIi8vTUVUQVwiKSArIDYsIG1ldGEubGFzdEluZGV4T2YoXCIqLy9cIikpO1xyXG4gICAgICAgIGlmIChtZXRhLmluZGV4T2YoXCJNRVRBXCIpIDwgMCkgdGhyb3cgbmV3IE1ldGFFcnJvcihcIk1FVEEgd2FzIG5vdCBmb3VuZC5cIik7XHJcbiAgICAgICAgY29uc3QgcGFyc2VkID0gVXRpbHMudGVzdEpTT04ocmF3TWV0YSk7XHJcbiAgICAgICAgaWYgKCFwYXJzZWQpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIGNvdWxkIG5vdCBiZSBwYXJzZWQuXCIpO1xyXG4gICAgICAgIGlmICghcGFyc2VkLm5hbWUpIHRocm93IG5ldyBNZXRhRXJyb3IoXCJNRVRBIG1pc3NpbmcgbmFtZSBkYXRhLlwiKTtcclxuICAgICAgICBwYXJzZWQuZm9ybWF0ID0gXCJqc29uXCI7XHJcbiAgICAgICAgcmV0dXJuIHBhcnNlZDtcclxuICAgIH1cclxuXHJcbiAgICBwYXJzZU5ld01ldGEoY29udGVudCkge1xyXG4gICAgICAgIGNvbnN0IGJsb2NrID0gY29udGVudC5zcGxpdChcIi8qKlwiLCAyKVsxXS5zcGxpdChcIiovXCIsIDEpWzBdO1xyXG4gICAgICAgIGNvbnN0IG91dCA9IHt9O1xyXG4gICAgICAgIGxldCBmaWVsZCA9IFwiXCI7XHJcbiAgICAgICAgbGV0IGFjY3VtID0gXCJcIjtcclxuICAgICAgICBmb3IgKGNvbnN0IGxpbmUgb2YgYmxvY2suc3BsaXQoc3BsaXRSZWdleCkpIHtcclxuICAgICAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAwKSBjb250aW51ZTtcclxuICAgICAgICAgICAgaWYgKGxpbmUuY2hhckF0KDApID09PSBcIkBcIiAmJiBsaW5lLmNoYXJBdCgxKSAhPT0gXCIgXCIpIHtcclxuICAgICAgICAgICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGwgPSBsaW5lLmluZGV4T2YoXCIgXCIpO1xyXG4gICAgICAgICAgICAgICAgZmllbGQgPSBsaW5lLnN1YnN0cigxLCBsIC0gMSk7XHJcbiAgICAgICAgICAgICAgICBhY2N1bSA9IGxpbmUuc3Vic3RyKGwgKyAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFjY3VtICs9IFwiIFwiICsgbGluZS5yZXBsYWNlKFwiXFxcXG5cIiwgXCJcXG5cIikucmVwbGFjZShlc2NhcGVkQXRSZWdleCwgXCJAXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG91dFtmaWVsZF0gPSBhY2N1bS50cmltKCk7XHJcbiAgICAgICAgZGVsZXRlIG91dFtcIlwiXTtcclxuICAgICAgICBvdXQuZm9ybWF0ID0gXCJqc2RvY1wiO1xyXG4gICAgICAgIHJldHVybiBvdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29udGVudFJlcXVpcmUodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSBpc1BsdWdpbiA/IG9yaWdpbmFsSlNSZXF1aXJlIDogb3JpZ2luYWxDU1NSZXF1aXJlO1xyXG4gICAgICAgIHJldHVybiBmdW5jdGlvbihtb2R1bGUsIGZpbGVuYW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJhc2VGb2xkZXIgPSBpc1BsdWdpbiA/IHNlbGYucGx1Z2luc0ZvbGRlciA6IHNlbGYudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgICAgICBjb25zdCBwb3NzaWJsZVBhdGggPSBwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgcGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocG9zc2libGVQYXRoKSB8fCBmaWxlbmFtZSAhPT0gZnMucmVhbHBhdGhTeW5jKHBvc3NpYmxlUGF0aCkpIHJldHVybiBSZWZsZWN0LmFwcGx5KG9yaWdpbmFsUmVxdWlyZSwgdGhpcywgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBmcy5yZWFkRmlsZVN5bmMoZmlsZW5hbWUsIFwidXRmOFwiKTtcclxuICAgICAgICAgICAgY29udGVudCA9IFV0aWxzLnN0cmlwQk9NKGNvbnRlbnQpO1xyXG5cclxuICAgICAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBzZWxmLmV4dHJhY3RNZXRhKGNvbnRlbnQpO1xyXG4gICAgICAgICAgICBtZXRhLmZpbGVuYW1lID0gcGF0aC5iYXNlbmFtZShmaWxlbmFtZSk7XHJcbiAgICAgICAgICAgIG1ldGEuYWRkZWQgPSBzdGF0cy5hdGltZU1zO1xyXG4gICAgICAgICAgICBtZXRhLm1vZGlmaWVkID0gc3RhdHMubXRpbWVNcztcclxuICAgICAgICAgICAgbWV0YS5zaXplID0gc3RhdHMuc2l6ZTtcclxuICAgICAgICAgICAgaWYgKCFpc1BsdWdpbikge1xyXG4gICAgICAgICAgICAgICAgbWV0YS5jc3MgPSBjb250ZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKG1ldGEuZm9ybWF0ID09IFwianNvblwiKSBtZXRhLmNzcyA9IG1ldGEuY3NzLnNwbGl0KFwiXFxuXCIpLnNsaWNlKDEpLmpvaW4oXCJcXG5cIik7XHJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gYG1vZHVsZS5leHBvcnRzID0gJHtKU09OLnN0cmluZ2lmeShtZXRhKX07YDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoaXNQbHVnaW4pIHtcclxuICAgICAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBtb2R1bGUuZmlsZW5hbWUpO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGlkRXhwb3J0ID0gIVV0aWxzLmlzRW1wdHkobW9kdWxlLmV4cG9ydHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRpZEV4cG9ydCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1ldGEudHlwZSA9IG1vZHVsZS5leHBvcnRzO1xyXG4gICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbWV0YTtcclxuICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLndhcm4oXCJNb2R1bGUgTm90IEV4cG9ydGVkXCIsIGAke21ldGEubmFtZX0sIHBsZWFzZSBzdGFydCBzZXR0aW5nIG1vZHVsZS5leHBvcnRzYCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCArPSBgXFxubW9kdWxlLmV4cG9ydHMgPSAke0pTT04uc3RyaW5naWZ5KG1ldGEpfTtcXG5tb2R1bGUuZXhwb3J0cy50eXBlID0gJHttZXRhLmV4cG9ydHMgfHwgbWV0YS5uYW1lfTtgO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG1vZHVsZS5fY29tcGlsZShjb250ZW50LCBmaWxlbmFtZSk7XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlUGxhY2Vob2xkZXJQbHVnaW4oZGF0YSkge1xyXG4gICAgICAgIHJldHVybiB7cGx1Z2luOiB7XHJcbiAgICAgICAgICAgICAgICBzdGFydDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICBnZXROYW1lOiAoKSA9PiB7cmV0dXJuIGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lO30sXHJcbiAgICAgICAgICAgICAgICBnZXRBdXRob3I6ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9LFxyXG4gICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRpb246ICgpID0+IHtyZXR1cm4gZGF0YS5tZXNzYWdlID8gZGF0YS5tZXNzYWdlIDogXCJUaGlzIHBsdWdpbiB3YXMgdW5hYmxlIHRvIGJlIGxvYWRlZC4gQ2hlY2sgdGhlIGF1dGhvcidzIHBhZ2UgZm9yIHVwZGF0ZXMuXCI7fSxcclxuICAgICAgICAgICAgICAgIGdldFZlcnNpb246ICgpID0+IHtyZXR1cm4gXCI/Pz9cIjt9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSB8fCBkYXRhLmZpbGVuYW1lLFxyXG4gICAgICAgICAgICBmaWxlbmFtZTogZGF0YS5maWxlbmFtZSxcclxuICAgICAgICAgICAgc291cmNlOiBkYXRhLnNvdXJjZSA/IGRhdGEuc291cmNlIDogXCJcIixcclxuICAgICAgICAgICAgd2Vic2l0ZTogZGF0YS53ZWJzaXRlID8gZGF0YS53ZWJzaXRlIDogXCJcIlxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKGZpbGVuYW1lKSA9PT0gXCJ1bmRlZmluZWRcIiB8fCB0eXBlb2YodHlwZSkgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcblxyXG4gICAgICAgIGlmKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy02XCJdKXtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSwgKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdClcclxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdClcclxuICAgICAgICAgICAgICAgIH0sIChoYXNoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1c3BlY3Q6IGZhbHNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNoOiBoYXNoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0sIHRydWUpXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIGlmKHJlc3VsdCl7XHJcbiAgICAgICAgICAgICAgICBhZGRvbkNhY2hlW3Jlc3VsdC5oYXNoXSA9IHtcclxuICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgaGFzaDogcmVzdWx0Lmhhc2gsXHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiByZXN1bHRcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgICAgICAgICAgICAgaWYocmVzdWx0LnN1c3BlY3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGZpbGVuYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlbmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogXCJUaGlzIHBsdWdpbiBtaWdodCBiZSBkYW5nZXJvdXMgKFwiK3Jlc3VsdC5oYXJtK1wiKS5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIlRoaXMgcGx1Z2luIG1pZ2h0IGJlIGRhbmdlcm91cyAoXCIrcmVzdWx0Lmhhcm0rXCIpLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbXBpbGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICBjb25zdCBjb250ZW50ID0gd2luZG93LnJlcXVpcmUocGF0aC5yZXNvbHZlKGJhc2VGb2xkZXIsIGZpbGVuYW1lKSk7XHJcbiAgICAgICAgaWYoIWNvbnRlbnQubmFtZSlyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDYW5ub3QgZXNjYXBlIHRoZSBJRC5cIiwgZXJyb3I6IG5ldyBFcnJvcihcIkNhbm5vdCByZWFkIHByb3BlcnR5ICdyZXBsYWNlJyBvZiB1bmRlZmluZWRcIil9XHJcbiAgICAgICAgY29udGVudC5pZCA9IFV0aWxzLmVzY2FwZUlEKGNvbnRlbnQubmFtZSk7XHJcbiAgICAgICAgLy9pZighaWQpcmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiSW52YWxpZCBJRFwiLCBlcnJvcjogbmV3IEVycm9yKFwiUGxlYXNlIGZpeCB0aGUgbmFtZSBvZiBcIitmaWxlbmFtZStcIi4gQmV0dGVyRGlzY29yZCBjYW4ndCBlc2NhcGUgYW4gSUQuXCIpfVxyXG4gICAgICAgIGlmIChpc1BsdWdpbikge1xyXG4gICAgICAgICAgICBpZiAoIWNvbnRlbnQudHlwZSkgcmV0dXJuO1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29udGVudC5wbHVnaW4gPSBuZXcgY29udGVudC50eXBlKCk7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYmRwbHVnaW5zW2NvbnRlbnQucGx1Z2luLmdldE5hbWUoKV07XHJcbiAgICAgICAgICAgICAgICBiZHBsdWdpbnNbY29udGVudC5wbHVnaW4uZ2V0TmFtZSgpXSA9IGNvbnRlbnQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7cmV0dXJuIHtuYW1lOiBmaWxlbmFtZSwgZmlsZTogZmlsZW5hbWUsIG1lc3NhZ2U6IFwiQ291bGQgbm90IGJlIGNvbnN0cnVjdGVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsIHN0YWNrOiBlcnJvci5zdGFja319O31cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGRlbGV0ZSBiZHRoZW1lc1tjb250ZW50Lm5hbWVdO1xyXG4gICAgICAgICAgICBiZHRoZW1lc1tjb250ZW50Lm5hbWVdID0gY29udGVudDtcclxuICAgICAgICB9XHJcbiAgICB9ICAgXHJcblxyXG4gICAgdW5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YoZmlsZW5hbWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHR5cGVvZih0eXBlKSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBiYXNlRm9sZGVyID0gaXNQbHVnaW4gPyB0aGlzLnBsdWdpbnNGb2xkZXIgOiB0aGlzLnRoZW1lc0ZvbGRlcjtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBkZWxldGUgd2luZG93LnJlcXVpcmUuY2FjaGVbd2luZG93LnJlcXVpcmUucmVzb2x2ZShwYXRoLnJlc29sdmUoYmFzZUZvbGRlciwgZmlsZW5hbWUpKV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlcnIpIHtyZXR1cm4ge25hbWU6IGZpbGVuYW1lLCBmaWxlOiBmaWxlbmFtZSwgbWVzc2FnZTogXCJDb3VsZCBub3QgYmUgdW5sb2FkZWQuXCIsIGVycm9yOiB7bWVzc2FnZTogZXJyLm1lc3NhZ2UsIHN0YWNrOiBlcnIuc3RhY2t9fTt9XHJcbiAgICB9XHJcblxyXG4gICAgaXNMb2FkZWQoZmlsZW5hbWUsIHR5cGUpIHtcclxuICAgICAgICBjb25zdCBpc1BsdWdpbiA9IHR5cGUgPT09IFwicGx1Z2luXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZUZvbGRlciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgdHJ5IHt3aW5kb3cucmVxdWlyZS5jYWNoZVt3aW5kb3cucmVxdWlyZS5yZXNvbHZlKHBhdGgucmVzb2x2ZShiYXNlRm9sZGVyLCBmaWxlbmFtZSkpXTt9XHJcbiAgICAgICAgY2F0Y2ggKGVycikge3JldHVybiBmYWxzZTt9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVsb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGNhbnRVbmxvYWQgPSB0aGlzLnVubG9hZENvbnRlbnQoZmlsZW5hbWUsIHR5cGUpO1xyXG4gICAgICAgIGlmIChjYW50VW5sb2FkKSByZXR1cm4gY2FudFVubG9hZDtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZE5ld0NvbnRlbnQodHlwZSkge1xyXG4gICAgICAgIGNvbnN0IGlzUGx1Z2luID0gdHlwZSA9PT0gXCJwbHVnaW5cIjtcclxuICAgICAgICBjb25zdCBmaWxlRW5kaW5nID0gaXNQbHVnaW4gPyBcIi5wbHVnaW4uanNcIiA6IFwiLnRoZW1lLmNzc1wiO1xyXG4gICAgICAgIGNvbnN0IGJhc2VkaXIgPSBpc1BsdWdpbiA/IHRoaXMucGx1Z2luc0ZvbGRlciA6IHRoaXMudGhlbWVzRm9sZGVyO1xyXG4gICAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoYmFzZWRpcik7XHJcbiAgICAgICAgY29uc3QgY29udGVudExpc3QgPSBPYmplY3QudmFsdWVzKGlzUGx1Z2luID8gYmRwbHVnaW5zIDogYmR0aGVtZXMpO1xyXG4gICAgICAgIGNvbnN0IHJlbW92ZWQgPSBjb250ZW50TGlzdC5maWx0ZXIodCA9PiAhZmlsZXMuaW5jbHVkZXModC5maWxlbmFtZSkpLm1hcChjID0+IGlzUGx1Z2luID8gYy5wbHVnaW4uZ2V0TmFtZSgpIDogYy5uYW1lKTtcclxuICAgICAgICBjb25zdCBhZGRlZCA9IGZpbGVzLmZpbHRlcihmID0+ICFjb250ZW50TGlzdC5maW5kKHQgPT4gdC5maWxlbmFtZSA9PSBmKSAmJiBmLmVuZHNXaXRoKGZpbGVFbmRpbmcpICYmIGZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmKSkuaXNGaWxlKCkpO1xyXG4gICAgICAgIHJldHVybiB7YWRkZWQsIHJlbW92ZWR9O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGxvYWRBbGxDb250ZW50KHR5cGUpIHtcclxuICAgICAgICB0aGlzLnBhdGNoRXh0ZW5zaW9ucygpXHJcbiAgICAgICAgY29uc3QgaXNQbHVnaW4gPSB0eXBlID09PSBcInBsdWdpblwiO1xyXG4gICAgICAgIGNvbnN0IGZpbGVFbmRpbmcgPSBpc1BsdWdpbiA/IFwiLnBsdWdpbi5qc1wiIDogXCIudGhlbWUuY3NzXCI7XHJcbiAgICAgICAgY29uc3QgYmFzZWRpciA9IGlzUGx1Z2luID8gdGhpcy5wbHVnaW5zRm9sZGVyIDogdGhpcy50aGVtZXNGb2xkZXI7XHJcbiAgICAgICAgY29uc3QgZXJyb3JzID0gW107XHJcbiAgICAgICAgY29uc3QgZmlsZXMgPSBmcy5yZWFkZGlyU3luYyhiYXNlZGlyKTtcclxuXHJcbiAgICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmaWxlcykge1xyXG4gICAgICAgICAgICBpZiAoIWZzLnN0YXRTeW5jKHBhdGgucmVzb2x2ZShiYXNlZGlyLCBmaWxlbmFtZSkpLmlzRmlsZSgpIHx8ICFmaWxlbmFtZS5lbmRzV2l0aChmaWxlRW5kaW5nKSkgY29udGludWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5sb2FkQ29udGVudChmaWxlbmFtZSwgdHlwZSk7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikgZXJyb3JzLnB1c2goZXJyb3IpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9ycztcclxuICAgIH1cclxuXHJcbiAgICBsb2FkUGx1Z2lucygpIHtyZXR1cm4gdGhpcy5sb2FkQWxsQ29udGVudChcInBsdWdpblwiKTt9XHJcbiAgICBsb2FkVGhlbWVzKCkge3JldHVybiB0aGlzLmxvYWRBbGxDb250ZW50KFwidGhlbWVcIik7fVxyXG59O1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb250ZW50TWFuYWdlciAtIGNvdWxkIGJlIGRhbmdlcm91cyBmb3Igbm93XHJcbiAqLyIsImltcG9ydCB7YmRDb25maWcsIG1pblN1cHBvcnRlZFZlcnNpb24sIGJiZFZlcnNpb24sIHNldHRpbmdzQ29va2llLCBiZHBsdWdpbkVycm9ycywgYmR0aGVtZUVycm9ycywgYmJkQ2hhbmdlbG9nLCBkZWZhdWx0Q29va2llLCBjdXJyZW50RGlzY29yZFZlcnNpb24sIGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi92MlwiO1xyXG5pbXBvcnQgc2V0dGluZ3NQYW5lbCBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsXCI7XHJcbmltcG9ydCBwbHVnaW5Nb2R1bGUgZnJvbSBcIi4vcGx1Z2luTW9kdWxlXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4vd2VicGFja01vZHVsZXNcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi9kb210b29sc1wiO1xyXG5cclxuaW1wb3J0IEJETG9nbyBmcm9tIFwiLi4vdWkvYmRMb2dvXCI7XHJcbmltcG9ydCBUb29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcclxuaW1wb3J0IExpZ2h0Y29yZExvZ28gZnJvbSBcIi4uL3N2Zy9saWdodGNvcmRcIjtcclxuaW1wb3J0IFBsdWdpbkNlcnRpZmllciBmcm9tIFwiLi9wbHVnaW5DZXJ0aWZpZXJcIjtcclxuaW1wb3J0IGRpc3RhbnQsIHsgdXVpZHY0IH0gZnJvbSBcIi4vZGlzdGFudFwiO1xyXG5pbXBvcnQgRW1vamlNb2R1bGUgZnJvbSBcIi4vZW1vamlNb2R1bGVcIlxyXG5pbXBvcnQge3JlbW90ZSBhcyBlbGVjdHJvbn0gZnJvbSBcImVsZWN0cm9uXCJcclxuaW1wb3J0IHYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxubGV0IG1ldGhvZHNcclxuZnVuY3Rpb24gQ29yZSgpIHt9XHJcblxyXG5cclxuQ29yZS5wcm90b3R5cGUuc2V0Q29uZmlnID0gZnVuY3Rpb24oY29uZmlnKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICBPYmplY3QuYXNzaWduKGJkQ29uZmlnLCBjb25maWcpO1xyXG59O1xyXG5cclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENvcmUucHJvdG90eXBlLCBcIm1ldGhvZHNcIiwge1xyXG4gICAgZ2V0KCl7XHJcbiAgICAgICAgcmV0dXJuIG1ldGhvZHNcclxuICAgIH1cclxufSlcclxuXHJcbkNvcmUucHJvdG90eXBlLnNldE1ldGhvZHMgPSBmdW5jdGlvbihtKSB7XHJcbiAgICBpZiAodGhpcy5oYXNTdGFydGVkKSByZXR1cm47XHJcbiAgICBtZXRob2RzID0gbVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMuaGFzU3RhcnRlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5oYXNTdGFydGVkID0gdHJ1ZTtcclxuXHJcbiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5mbGF0KSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmV0dGVyRGlzY29yZCB2XCIgKyBiYmRWZXJzaW9uICsgXCIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIG9sZCB2ZXJzaW9uIChcIiArIGN1cnJlbnREaXNjb3JkVmVyc2lvbiArIFwiKSBvZiBEaXNjb3JkLiBQbGVhc2UgdXBkYXRlIHlvdXIgRGlzY29yZCBpbnN0YWxsYXRpb24gYmVmb3JlIHByb2NlZWRpbmcuXCIpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmRDb25maWcudmVyc2lvbiA8IG1pblN1cHBvcnRlZFZlcnNpb24pIHtcclxuICAgICAgICBVdGlscy5hbGVydChcIk5vdCBTdXBwb3J0ZWRcIiwgXCJCZXR0ZXJEaXNjb3JkIHZcIiArIGJkQ29uZmlnLnZlcnNpb24gKyBcIiAoeW91ciB2ZXJzaW9uKVwiICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgbGF0ZXN0IGpzIChcIiArIGJiZFZlcnNpb24gKyBcIikuPGJyPjxicj4gUGxlYXNlIGRvd25sb2FkIHRoZSBsYXRlc3QgdmVyc2lvbiBmcm9tIDxhIGhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvcmVsZWFzZXMvbGF0ZXN0JyB0YXJnZXQ9J19ibGFuayc+R2l0SHViPC9hPlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHdpbmRvdy5FRCkge1xyXG4gICAgICAgIFV0aWxzLmFsZXJ0KFwiTm90IFN1cHBvcnRlZFwiLCBcIkJhbmRhZ2VkQkQgZG9lcyBub3Qgd29yayB3aXRoIEVuaGFuY2VkRGlzY29yZC4gUGxlYXNlIHVuaW5zdGFsbCBvbmUgb2YgdGhlbS5cIik7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh3aW5kb3cuV2ViU29ja2V0ICYmIHdpbmRvdy5XZWJTb2NrZXQubmFtZSAmJiB3aW5kb3cuV2ViU29ja2V0Lm5hbWUuaW5jbHVkZXMoXCJQYXRjaGVkXCIpKSB7XHJcbiAgICAgICAgVXRpbHMuYWxlcnQoXCJOb3QgU3VwcG9ydGVkXCIsIFwiQmFuZGFnZWRCRCBkb2VzIG5vdCB3b3JrIHdpdGggUG93ZXJjb3JkLiBQbGVhc2UgdW5pbnN0YWxsIG9uZSBvZiB0aGVtLlwiKTtcclxuICAgICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaEF0dHJpYnV0ZXMuYmluZCh0aGlzKSwgXCJMQyBQbHVnaW4gQ2VydGlmaWVyIFBhdGNoXCIpKCk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIkluaXRpYWxpemluZyBTZXR0aW5nc1wiKTtcclxuICAgIHRoaXMuaW5pdFNldHRpbmdzKCk7XHJcblxyXG4gICAgYXdhaXQgdGhpcy5jaGVja0Zvckd1aWxkcygpO1xyXG4gICAgQkRWMi5pbml0aWFsaXplKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiVXBkYXRpbmcgU2V0dGluZ3NcIik7XHJcbiAgICBzZXR0aW5nc1BhbmVsLmluaXRpYWxpemVTZXR0aW5ncygpO1xyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIEFkZG9ucyBDYWNoZVwiKVxyXG4gICAgYXdhaXQgY29udGVudE1hbmFnZXIubG9hZEFkZG9uQ2VydGlmaWVyQ2FjaGUoKVxyXG5cclxuICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJMb2FkaW5nIFBsdWdpbnNcIik7XHJcbiAgICBhd2FpdCBwbHVnaW5Nb2R1bGUubG9hZFBsdWdpbnMoKTtcclxuXHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiTG9hZGluZyBUaGVtZXNcIik7XHJcbiAgICBhd2FpdCB0aGVtZU1vZHVsZS5sb2FkVGhlbWVzKCk7XHJcblxyXG4gICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIEJ1ZmZlci5mcm9tKERhdGFTdG9yZS5nZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiKSwgXCJiYXNlNjRcIikudG9TdHJpbmcoXCJ1dGY4XCIpKTtcclxuXHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBmdW5jdGlvbigpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZGMtMFwiXSkgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5idG4uYnRuLWRpc2Nvbm5lY3RcIikuY2xpY2soKTtcclxuICAgIH0pO1xyXG5cclxuICAgIFBsdWdpbkNlcnRpZmllci5zdGFydCgpXHJcblxyXG4gICAgVXRpbHMubG9nKFwiU3RhcnR1cFwiLCBcIlJlbW92aW5nIExvYWRpbmcgSWNvblwiKTtcclxuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYmQtbG9hZGVydjJcIikubGVuZ3RoKSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYmQtbG9hZGVydjJcIilbMF0ucmVtb3ZlKCk7XHJcbiAgICBVdGlscy5sb2coXCJTdGFydHVwXCIsIFwiSW5pdGlhbGl6aW5nIE1haW4gT2JzZXJ2ZXJcIik7XHJcbiAgICB0aGlzLmluaXRPYnNlcnZlcigpO1xyXG5cclxuICAgIC8vIFNob3cgbG9hZGluZyBlcnJvcnNcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkge1xyXG4gICAgICAgIFV0aWxzLmxvZyhcIlN0YXJ0dXBcIiwgXCJDb2xsZWN0aW5nIFN0YXJ0dXAgRXJyb3JzXCIpO1xyXG4gICAgICAgIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBiZHBsdWdpbkVycm9ycywgdGhlbWVzOiBiZHRoZW1lRXJyb3JzfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcHJldmlvdXNWZXJzaW9uID0gRGF0YVN0b3JlLmdldEJERGF0YShcInZlcnNpb25cIik7XHJcbiAgICBpZiAoYmJkVmVyc2lvbiA+IHByZXZpb3VzVmVyc2lvbikge1xyXG4gICAgICAgIGlmIChiYmRDaGFuZ2Vsb2cpIHRoaXMuc2hvd0NoYW5nZWxvZ01vZGFsKGJiZENoYW5nZWxvZyk7XHJcbiAgICAgICAgRGF0YVN0b3JlLnNldEJERGF0YShcInZlcnNpb25cIiwgYmJkVmVyc2lvbik7XHJcbiAgICB9XHJcblxyXG4gICAgRW1vamlNb2R1bGUuc3RhcnQoKVxyXG5cclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hTb2NpYWwuYmluZCh0aGlzKSwgXCJCRCBTb2NpYWwgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFBpbGxzLmJpbmQodGhpcyksIFwiQkQgR3VpbGQgUGlsbHMgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZExpc3RJdGVtcy5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIExpc3QgSXRlbXMgUGF0Y2hcIikoKTtcclxuICAgIFV0aWxzLnN1cHByZXNzRXJyb3JzKHRoaXMucGF0Y2hHdWlsZFNlcGFyYXRvci5iaW5kKHRoaXMpLCBcIkJEIEd1aWxkIFNlcGFyYXRvciBQYXRjaFwiKSgpO1xyXG4gICAgVXRpbHMuc3VwcHJlc3NFcnJvcnModGhpcy5wYXRjaE1lc3NhZ2VIZWFkZXIuYmluZCh0aGlzKSwgXCJCRCBCYWRnZSBDaGF0IFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoTWVtYmVyTGlzdC5iaW5kKHRoaXMpLCBcIkJEIEJhZGdlIE1lbWJlciBMaXN0IFBhdGNoXCIpKCk7XHJcbiAgICBVdGlscy5zdXBwcmVzc0Vycm9ycyh0aGlzLnBhdGNoQXR0YWNobWVudC5iaW5kKHRoaXMpLCBcIkxDIFBsdWdpbiBDZXJ0aWZpZXIgUGF0Y2hcIikoKTtcclxuXHJcbiAgICBpZihiZENvbmZpZy5oYXZlSW5zdGFsbGVkRGVmYXVsdCl7XHJcbiAgICAgICAgbGV0IGFsZXJ0ID0gVXRpbHMuYWxlcnQoXCJGaXJzdCBJbnN0YWxsYXRpb25cIiwgXCJBcyBpdCBpcyB0aGUgZmlyc3QgdGltZSB5b3UgaW5zdGFsbCBMaWdodGNvcmQsIFdlIGFkZGVkIHR3byBkZWZhdWx0IHRoZW1lcyBhbmQgb25lIGRlZmF1bHQgcGx1Z2luIGluIHlvdXIgcGx1Z2luL3RoZW1lIGZvbGRlci4gQ2hlY2sgaXQgaW4gdGhlIFBsdWdpbi9UaGVtZSBzZXR0aW5ncy5cIilcclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICAgICAgICBhbGVydC5vbkNsb3NlKHJlc29sdmUpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuICAgIGNvbnN0IGxvZ28gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudCA+IGRpdi50eXBlV2luZG93cy0xemEtbjcud2l0aEZyYW1lLWhhWWx0SS50aXRsZUJhci1BQzRwR1YuaG9yaXpvbnRhbFJldmVyc2UtM3RSalk3LmZsZXgtMU8xR0tZLmRpcmVjdGlvblJvd1JldmVyc2UtbThJaklxLmp1c3RpZnlTdGFydC0yTkRGemkuYWxpZ25TdHJldGNoLURwR1BmMy5kYS10eXBlV2luZG93cy5kYS13aXRoRnJhbWUuZGEtdGl0bGVCYXIuZGEtaG9yaXpvbnRhbFJldmVyc2UuZGEtZmxleC5kYS1kaXJlY3Rpb25Sb3dSZXZlcnNlLmRhLWp1c3RpZnlTdGFydC5kYS1hbGlnblN0cmV0Y2ggPiBkaXYud29yZG1hcmtXaW5kb3dzLTF2MGxZRC53b3JkbWFyay0yaUREZm0uZGEtd29yZG1hcmtXaW5kb3dzLmRhLXdvcmRtYXJrXCIpXHJcbiAgICBpZihsb2dvKXtcclxuICAgICAgICBsb2dvLnN0eWxlLnRvcCA9IFwiM3B4XCJcclxuICAgICAgICBsb2dvLmlubmVySFRNTCA9IGA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIxMFwiIHdpZHRoPVwiNzBcIiB2aWV3Qm94PVwiMCAwIDcyLjU0IDEwXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogLTVweCwgbWFyZ2luLXRvcDogMTBweFwiPlxyXG4gICAgPHBhdGggZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNNDQuODEsOS42N1Y2LjMzYzAtMS4yMSwyLjEzLTEuNDksMi43OC0uMjhsMi0uODFBMy41MywzLjUzLDAsMCwwLDQ2LjIsM2MtMS45MiwwLTMuODEsMS4xMy0zLjgxLDMuMzNWOS42N2MwLDIuMjEsMS44OSwzLjMzLDMuNzcsMy4zM2EzLjg3LDMuODcsMCwwLDAsMy40NS0yLjE4bC0yLjEyLTFDNDcsMTEuMTcsNDQuODEsMTAuODUsNDQuODEsOS42N1pNMTAuNjgsMTIuODloMi40MVYzLjE3SDEwLjY4Wk03MS43NiwzLjE0SDY4LjE5VjcuMjNMNzAuNTcsOS40di00aDEuMjdjLjgxLDAsMS4yMS40MSwxLjIxLDF2M2MwLC42My0uMzgsMS4wNS0xLjIxLDEuMDVINjguMTh2Mi4zMWgzLjU3YzEuOTIsMCwzLjcyLTEsMy43Mi0zLjJWNi4zOUM3NS40OCw0LjEzLDczLjY4LDMuMTQsNzEuNzYsMy4xNFpNNTQuMjIsM2MtMiwwLTQsMS4xLTQsMy4zNFY5LjY2YzAsMi4yMywyLDMuMzQsNCwzLjM0czMuOTUtMS4xMSwzLjk1LTMuMzRWNi4zNEM1OC4xOSw0LjExLDU2LjIsMyw1NC4yMiwzWm0xLjU1LDYuNjZjMCwuNy0uNzgsMS4wNi0xLjU0LDEuMDZzLTEuNTUtLjM1LTEuNTUtMS4wNlY2LjM0YzAtLjcyLjc1LTEuMSwxLjUtMS4xczEuNTkuMzUsMS41OSwxLjFaTTY2Ljg0LDYuMzRjMC0yLjI5LTEuNTgtMy4yLTMuNTUtMy4ySDU5LjQ2djkuNzNoMi40NVY5Ljc3aC40M2wyLjIyLDMuMDloM0w2NSw5LjUyQzY2LjEzLDkuMTUsNjYuODQsOC4xNCw2Ni44NCw2LjM0Wk02My4zMyw3LjY1SDYxLjkxVjUuNDNoMS40MkExLjExLDEuMTEsMCwxLDEsNjMuMzMsNy42NVpNMjkuODMsMTNoMi40MlYzLjA2SDI5LjgzVjYuNzNsLTMsMFYzLjA5SDI0Ljd2OS43OGgyLjE0VjguNjhsMywwWk0xNy4xNiw5Ljc2VjYuNDJjMC0xLjIxLDIuMTMtMS40OSwyLjc4LS4yOGwyLS44MWEzLjU1LDMuNTUsMCwwLDAtMy4zNi0yLjI0Yy0xLjkyLDAtMy44MSwxLjEzLTMuODEsMy4zM1Y5Ljc2YzAsMi4yMSwyLDMuMTUsMy45LDMuMTVzMy41OC0xLDMuNTgtM1Y3LjU4SDE4Ljc5bDAsMS4zNkgyMC4zdi43N0MyMC4zLDEwLjkyLDE3LjE2LDEwLjk0LDE3LjE2LDkuNzZaXCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0yLjkzIC0zKVwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIzNS45MSAwLjA2IDM4LjQzIDAuMDYgMzguNDMgMS44NCAzNS45MiAxLjgxIDM1Ljk3IDEwIDMzLjU1IDEwIDMzLjQ5IDEuNzUgMzAuOTggMS43NCAzMC45OCAwLjA2IDMzLjQ5IDAuMDYgMzUuOTEgMC4wNlwiLz5cclxuICAgIDxwb2x5Z29uIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBwb2ludHM9XCIwIDkuOTcgNi41IDEwIDYuNSA3LjYzIDIuNDEgNy42MyAyLjQxIDAuMjYgMCAyLjI2IDAgOS45N1wiLz5cclxuPC9zdmc+YFxyXG4gICAgfVxyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hBdHRyaWJ1dGVzID0gYXN5bmMgZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgYXR0cmlic1BhdGNocyA9IFtdXHJcbiAgICB0aGlzLmNhbmNlbFBhdGNoQXR0cmlidXRlcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGF0dHJpYnNQYXRjaHMuZm9yRWFjaChlID0+IGUoKSlcclxuICAgIH1cclxuXHJcbiAgICB3aGlsZSghdjIuTWVzc2FnZUNvbXBvbmVudClhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSlcclxuICAgIFxyXG4gICAgLy8gVE9ETzogdHJ5IHRvIHBhdGNoIGNvcnJlY3RseSB0aGUgdXNlciBwb3BvdXQgb24gYSBuZXh0IHVwZGF0ZVxyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiRGlzY29yZFRhZ1wiKVxyXG4gICAgLnRoZW4oRGlzY29yZFRhZyA9PiB7XHJcbiAgICAgICAgbGV0IERpc2NvcmRUYWdDb21wID0gRGlzY29yZFRhZy5kZWZhdWx0XHJcbiAgICAgICAgRGlzY29yZFRhZy5kZWZhdWx0ID0gZnVuY3Rpb24ocHJvcHMpe1xyXG4gICAgICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSBEaXNjb3JkVGFnQ29tcChwcm9wcylcclxuXHJcbiAgICAgICAgICAgIGxldCBpZCA9IHV1aWR2NCgpXHJcblxyXG4gICAgICAgICAgICBsZXQgYmFkZ2VEaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImlubGluZVwiLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCI1cHhcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIGtleTogXCJiYWRnZXMtXCIraWQsXHJcbiAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiaW5oZXJpdFwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pKVxyXG5cclxuICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gW3JldHVyblZhbHVlXVxyXG5cclxuICAgICAgICAgICAgaWYgKHByb3BzLnVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJCYW5kYWdlZEJEIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQkRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wcy51c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHByb3BzLnVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpeyAvLyBOb3QgVGhvbWl6OiBMaWdodGNvcmQgRGV2ZWxvcGVyLCBQaG9yY3lzOiBMaWdodGNvcmQgRGV2ZWxvcGVyXHJcbiAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTGlnaHRjb3JkTG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goYmFkZ2VEaXYpXHJcbiAgICAgICAgICAgIGxldCBkaXYgPSBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImJsb2NrXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSwgY2hpbGRyZW4pXHJcbiAgICAgICAgICAgIGFwcGx5QmFkZ2VzKGlkLCBwcm9wcy51c2VyLCBmYWxzZSlcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkaXZcclxuICAgICAgICB9XHJcbiAgICB9KVxyXG5cclxuICAgIGF0dHJpYnNQYXRjaHMucHVzaChVdGlscy5tb25rZXlQYXRjaCh2Mi5NZXNzYWdlQ29tcG9uZW50LCBcImRlZmF1bHRcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZSl7IC8vIHRoaXMgY2FuIGJlIGEgYmxvY2tlZCBtZXNzYWdlIChub3Qgb3BlbmVkKVxyXG4gICAgICAgICAgICBkYXRhLnJldHVyblZhbHVlLnByb3BzW1wiZGF0YS1tZXNzYWdlLWlkXCJdID0gZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlLmlkXHJcbiAgICAgICAgfVxyXG4gICAgfX0pKVxyXG4gICAgICAgIC8qXHJcbiAgICBhdHRyaWJzUGF0Y2hzLnB1c2goVXRpbHMubW9ua2V5UGF0Y2godjIuTWVzc2FnZUNvbXBvbmVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBkYXRhLnJldHVyblZhbHVlLnByb3BzW1wibWVzc2FnZS1pZFwiXSA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLmNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMubWVzc2FnZS5pZFxyXG4gICAgfX0pKSovXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLmNoZWNrRm9yR3VpbGRzID0gZnVuY3Rpb24oKSB7XHJcbiAgICBsZXQgdGltZXNDaGVja2VkID0gMDtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcclxuICAgICAgICBjb25zdCBjaGVja0Zvckd1aWxkcyA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVyID0gQkRWMi5ndWlsZENsYXNzZXMud3JhcHBlci5zcGxpdChcIiBcIilbMF07XHJcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHt3cmFwcGVyfWApLmxlbmd0aCA+IDApIHRpbWVzQ2hlY2tlZCsrO1xyXG4gICAgICAgICAgICBjb25zdCBndWlsZCA9IEJEVjIuZ3VpbGRDbGFzc2VzLmxpc3RJdGVtLnNwbGl0KFwiIFwiKVswXTtcclxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IEJEVjIuZ3VpbGRDbGFzc2VzLmJsb2JDb250YWluZXIuc3BsaXQoXCIgXCIpWzBdO1xyXG4gICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7d3JhcHBlcn0gLiR7Z3VpbGR9IC4ke2Jsb2J9YCkubGVuZ3RoID4gMCkgcmV0dXJuIHJlc29sdmUoYmRDb25maWcuZGVmZXJMb2FkZWQgPSB0cnVlKTtcclxuICAgICAgICAgICAgZWxzZSBpZiAodGltZXNDaGVja2VkID49IDUwKSByZXR1cm4gcmVzb2x2ZShiZENvbmZpZy5kZWZlckxvYWRlZCA9IHRydWUpO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGNoZWNrRm9yR3VpbGRzLCAxMDApO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgIT0gXCJsb2FkaW5nXCIpIHNldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIiwgKCkgPT4ge3NldFRpbWVvdXQoY2hlY2tGb3JHdWlsZHMsIDEwMCk7fSk7XHJcbiAgICB9KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLmluamVjdEV4dGVybmFscyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgLy8gTm8gZXh0ZXJuYWxzXHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5pbml0U2V0dGluZ3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICBEYXRhU3RvcmUuaW5pdGlhbGl6ZSgpO1xyXG4gICAgaWYoIURhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJzZXR0aW5nc1wiKSAmJiAhRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSl7XHJcbiAgICAgICAgaWYgKCFEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5nc0Nvb2tpZSwgZGVmYXVsdENvb2tpZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSkge1xyXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCBkZWZhdWx0UlBDKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc2V0dGluZ3NQYW5lbC5sb2FkU2V0dGluZ3MoKTtcclxuICAgICAgICBmb3IgKGNvbnN0IHNldHRpbmcgaW4gZGVmYXVsdENvb2tpZSkge1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbc2V0dGluZ10gPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nXSA9IGRlZmF1bHRDb29raWVbc2V0dGluZ107XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc1BhbmVsLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnByb3RvdHlwZSAmJiBlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zKVxyXG4gICAgLnRoZW4oc2V0dGluZ01vZHVsZSA9PiB7XHJcblxyXG4gICAgICAgIGxldCBnZXRQcmVkaWNhdGVTZWN0aW9ucyA9IHNldHRpbmdNb2R1bGUuZGVmYXVsdC5wcm90b3R5cGUuZ2V0UHJlZGljYXRlU2VjdGlvbnNcclxuICAgICAgICBzZXR0aW5nTW9kdWxlLmRlZmF1bHQucHJvdG90eXBlLmdldFByZWRpY2F0ZVNlY3Rpb25zID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGdldFByZWRpY2F0ZVNlY3Rpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG5cclxuICAgICAgICAgICAgaWYoIXJlc3VsdFsxXSlyZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgICAgIGlmKHJlc3VsdFsxXS5zZWN0aW9uID09PSBcIk15IEFjY291bnRcIil7IC8vIHVzZXIgc2V0dGluZ3MsIG5vdCBndWlsZCBzZXR0aW5nc1xyXG4gICAgICAgICAgICAgICAgbGV0IHBvcGVkID0gW11cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcbiAgICAgICAgICAgICAgICBwb3BlZC5wdXNoKHJlc3VsdC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIHBvcGVkLnB1c2gocmVzdWx0LnBvcCgpKVxyXG4gICAgICAgICAgICAgICAgcG9wZWQucHVzaChyZXN1bHQucG9wKCkpXHJcblxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uc2V0dGluZ3NQYW5lbC5yZW5kZXJTaWRlYmFyKHRoaXMpKVxyXG5cclxuICAgICAgICAgICAgICAgIHdoaWxlKHBvcGVkWzBdKXtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChwb3BlZC5wb3AoKSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XHJcbiAgICAgICAgfVxyXG4gICAgfSlcclxufTtcclxuXHJcblxyXG5sZXQgY2xhc3NOYW1lTGF5ZXJcclxubGV0IGNsYXNzTmFtZVNvY2lhbExpbmtzXHJcbmxldCBjbGFzc05hbWVNb2RhbFxyXG5cclxuQ29yZS5wcm90b3R5cGUuaW5pdE9ic2VydmVyID0gZnVuY3Rpb24gKCkge1xyXG4gICAgY29uc3QgbWFpbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBtbGVuID0gbXV0YXRpb25zLmxlbmd0aDsgaSA8IG1sZW47IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVnaW5Nb2R1bGUgIT09IFwidW5kZWZpbmVkXCIpIHBsdWdpbk1vZHVsZS5yYXdPYnNlcnZlcihtdXRhdGlvbik7XHJcblxyXG4gICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgbm90aGluZyBhZGRlZCwgc2tpcFxyXG4gICAgICAgICAgICBpZiAoIW11dGF0aW9uLmFkZGVkTm9kZXMubGVuZ3RoIHx8ICEobXV0YXRpb24uYWRkZWROb2Rlc1swXSBpbnN0YW5jZW9mIEVsZW1lbnQpKSBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi5hZGRlZE5vZGVzWzBdO1xyXG5cclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZUxheWVyKWNsYXNzTmFtZUxheWVyID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5sYXllciAmJiB0eXBlb2YgZS5sYXllciA9PT0gXCJzdHJpbmdcIiAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXJcclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZVNvY2lhbExpbmtzKWNsYXNzTmFtZVNvY2lhbExpbmtzID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5zb2NpYWxMaW5rcyAmJiB0eXBlb2YgZS5zb2NpYWxMaW5rcyA9PT0gXCJzdHJpbmdcIilbMF0uc29jaWFsTGlua3NcclxuICAgICAgICAgICAgaWYoIWNsYXNzTmFtZU1vZGFsKWNsYXNzTmFtZU1vZGFsID0gQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tb2RhbCAmJiB0eXBlb2YgZS5tb2RhbCA9PT0gXCJzdHJpbmdcIiAmJiBlLmlubmVyICYmIHR5cGVvZiBlLmlubmVyID09PSBcInN0cmluZ1wiICYmICFlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSlbMF0ubW9kYWxcclxuXHJcbiAgICAgICAgICAgIGlmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcikpIHtcclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgPT09IFwiR1VJTERfU0VUVElOR1NcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoXCJsYXllci1pZFwiLCBcInNlcnZlci1zZXR0aW5nc1wiKTtcclxuICAgICAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShcImlkXCIsIFwic2VydmVyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmIChub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lU29jaWFsTGlua3MpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwibGF5ZXItaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgXCJ1c2VyLXNldHRpbmdzXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobm9kZS5wYXJlbnRFbGVtZW50ID09IGRvY3VtZW50LmJvZHkgJiYgbm9kZS5xdWVyeVNlbGVjdG9yKFwiI2FjZV9zZXR0aW5nc21lbnVcIikpIG5vZGUuaWQgPSBcImFjZV9zZXR0aW5nc21lbnVfY29udGFpbmVyXCI7XHJcblxyXG4gICAgICAgICAgICAvLyBFbW9qaSBQaWNrZXJcclxuICAgICAgICAgICAgLy9ub2RlLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJlbW9qaVBpY2tlci0zbTFTLWpcIikubGVuZ3RoICYmICFub2RlLnF1ZXJ5U2VsZWN0b3IoXCIuZW1vamlQaWNrZXItM20xUy1qXCIpLnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYW5pbWF0b3JMZWZ0LTFFUXhVMFwiKVxyXG4gICAgICAgICAgICAvL2lmIChub2RlLmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVMYXllcjIpICYmIG5vZGUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVFbW9qaVBpY2tlcikubGVuZ3RoICAmJiAhbm9kZS5xdWVyeVNlbGVjdG9yKFwiLlwiK2NsYXNzTmFtZUVtb2ppUGlja2VyKS5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWVBbmltYXRvckxlZnQpKSBxdWlja0Vtb3RlTWVudS5vYnNDYWxsYmFjayhub2RlKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgbWFpbk9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQsIHtcclxuICAgICAgICBjaGlsZExpc3Q6IHRydWUsXHJcbiAgICAgICAgc3VidHJlZTogdHJ1ZVxyXG4gICAgfSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5zaG93Q2hhbmdlbG9nTW9kYWwgPSBmdW5jdGlvbihvcHRpb25zID0ge30pIHtcclxuICAgIHJldHVybiBVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5hbGVydCA9IGZ1bmN0aW9uKHRpdGxlLCBjb250ZW50KSB7XHJcbiAgICByZXR1cm4gVXRpbHMuYWxlcnQodGl0bGUsIGNvbnRlbnQpO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUucGF0Y2hTb2NpYWwgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLnNvY2lhbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBUYWJCYXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIlRhYkJhclwiKTtcclxuICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xyXG4gICAgaWYgKCFUYWJCYXIpIHJldHVybjtcclxuICAgIHRoaXMuc29jaWFsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChUYWJCYXIucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNoaWxkcmVuO1xyXG4gICAgICAgIGlmICghY2hpbGRyZW4gfHwgIWNoaWxkcmVuLmxlbmd0aCB8fCBjaGlsZHJlbi5sZW5ndGggPCAzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDNdLnR5cGUuZGlzcGxheU5hbWUgIT09IFwiU2VwYXJhdG9yXCIpIHJldHVybjtcclxuICAgICAgICBpZiAoIWNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGUudG9TdHJpbmcoKS5pbmNsdWRlcyhcInNvY2lhbExpbmtzXCIpKSByZXR1cm47XHJcbiAgICAgICAgaWYgKEFuY2hvcikge1xyXG4gICAgICAgICAgICBsZXQgc29jaWFsTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNvY2lhbExpbmtzKVswXVxyXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDJdLnR5cGU7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld09uZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWwoLi4uYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICAgIHJldHVyblZhbC5wcm9wcy5jaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLXNvY2lhbC1saW5rIFwiK3NvY2lhbE1vZHVsZTEubGluaywgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1zb2NpYWwtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoVG9vbHRpcFdyYXAsIHtjb2xvcjogXCJibGFja1wiLCBzaWRlOiBcInRvcFwiLCB0ZXh0OiBcIkJhbmRhZ2VkQkRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxpbmsgXCIrc29jaWFsTW9kdWxlMS5saW5rLCBocmVmOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHBcIiwgdGl0bGU6IFwiQmFuZGFnZWRCRFwiLCB0YXJnZXQ6IFwiX2JsYW5rXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtc29jaWFsLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVyblZhbDtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMl0udHlwZSA9IG5ld09uZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZUNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIHNpemVzLFxyXG4gICAgICAgICAgICBjbGFzc05hbWVWZXJzaW9uSGFzaFxyXG4gICAgICAgIF0gPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yTXV0ZWQpWzBdLmNvbG9yTXV0ZWQsXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnZlcnNpb25IYXNoKVswXS52ZXJzaW9uSGFzaFxyXG4gICAgICAgIF1cclxuXHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkhhc2ggPSBgKCR7YmRDb25maWcuaGFzaCA/IGJkQ29uZmlnLmhhc2guc3Vic3RyaW5nKDAsIDcpIDogYmRDb25maWcuYnJhbmNofSlgO1xyXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWwgPSBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYExpZ2h0Y29yZCAke2VsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS52ZXJzaW9ufSBgLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IGNsYXNzTmFtZVZlcnNpb25IYXNoK1wiIGRhLXZlcnNpb25IYXNoXCJ9LCBgKCR7KGVsZWN0cm9uLmdldEdsb2JhbChcIkJ1aWxkSW5mb1wiKS5jb21taXQgfHwgXCJVbmtub3duXCIpLnNsaWNlKDAsIDcpfSlgKSksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBgJHtjbGFzc05hbWVDb2xvck11dGVkfSAke3NpemVzLnNpemUxMn1gfSwgYEJCRCAke2JiZFZlcnNpb259IGAsIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogY2xhc3NOYW1lVmVyc2lvbkhhc2grXCIgZGEtdmVyc2lvbkhhc2hcIn0sIHZlcnNpb25IYXNoKSlcclxuICAgICAgICBdXHJcbiAgICAgICAgXHJcblxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVmVyc2lvbnMgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS50eXBlO1xyXG4gICAgICAgIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnR5cGUgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgY29uc3QgcmV0dXJuVmFsID0gb3JpZ2luYWxWZXJzaW9ucyguLi5hcmd1bWVudHMpO1xyXG4gICAgICAgICAgICByZXR1cm5WYWwucHJvcHMuY2hpbGRyZW4uc3BsaWNlKDEsIDAsIGFkZGl0aW9uYWwpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsO1xyXG4gICAgICAgIH07XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5jb25zdCBnZXRHdWlsZENsYXNzZXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGNvbnN0IGd1aWxkc1dyYXBwZXIgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcIndyYXBwZXJcIiwgXCJ1bnJlYWRNZW50aW9uc0JhclwiKTtcclxuICAgIGNvbnN0IGd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZ3VpbGRzRXJyb3JcIiwgXCJzZWxlY3RlZFwiKTtcclxuICAgIGNvbnN0IHBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImJsb2JDb250YWluZXJcIik7XHJcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRMaXN0SXRlbXMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkTGlzdEl0ZW1zUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkQ2xhc3NlcyA9IGdldEd1aWxkQ2xhc3NlcygpO1xyXG4gICAgY29uc3QgbGlzdEl0ZW1DbGFzcyA9IEd1aWxkQ2xhc3Nlcy5saXN0SXRlbS5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCBibG9iQ2xhc3MgPSBHdWlsZENsYXNzZXMuYmxvYkNvbnRhaW5lci5zcGxpdChcIiBcIilbMF07XHJcbiAgICBjb25zdCByZWFjdEluc3RhbmNlID0gQkRWMi5nZXRJbnRlcm5hbEluc3RhbmNlKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xpc3RJdGVtQ2xhc3N9IC4ke2Jsb2JDbGFzc31gKS5wYXJlbnRFbGVtZW50KTtcclxuICAgIGNvbnN0IEd1aWxkQ29tcG9uZW50ID0gcmVhY3RJbnN0YW5jZS5yZXR1cm4udHlwZTtcclxuICAgIGlmICghR3VpbGRDb21wb25lbnQpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRMaXN0SXRlbXNQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKEd1aWxkQ29tcG9uZW50LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge2FmdGVyOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgIGlmIChkYXRhLnJldHVyblZhbHVlICYmIGRhdGEudGhpc09iamVjdCkge1xyXG4gICAgICAgICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGRhdGEucmV0dXJuVmFsdWU7XHJcbiAgICAgICAgICAgIGNvbnN0IGd1aWxkRGF0YSA9IGRhdGEudGhpc09iamVjdC5wcm9wcztcclxuICAgICAgICAgICAgbGV0IGNsYXNzTmFtZSA9IHJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZVxyXG4gICAgICAgICAgICBjbGFzc05hbWUgKz0gXCIgYmQtZ3VpbGRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS51bnJlYWQpIGNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5zZWxlY3RlZCkgY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYXVkaW8pIGNsYXNzTmFtZSArPSBcIiBiZC1hdWRpb1wiO1xyXG4gICAgICAgICAgICBpZiAoZ3VpbGREYXRhLnZpZGVvKSBjbGFzc05hbWUgKz0gXCIgYmQtdmlkZW9cIjtcclxuICAgICAgICAgICAgaWYgKGd1aWxkRGF0YS5iYWRnZSkgY2xhc3NOYW1lICs9IFwiIGJkLWJhZGdlXCI7XHJcbiAgICAgICAgICAgIGlmIChndWlsZERhdGEuYW5pbWF0YWJsZSkgY2xhc3NOYW1lICs9IFwiIGJkLWFuaW1hdGFibGVcIjtcclxuICAgICAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lID0gY2xhc3NOYW1lXHJcbiAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgICAgICB9XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEd1aWxkUGlsbHMgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkUGlsbFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBndWlsZFBpbGwgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmICFtLmRlZmF1bHQuZGlzcGxheU5hbWUgJiYgbS5kZWZhdWx0LnRvU3RyaW5nICYmIG0uZGVmYXVsdC50b1N0cmluZygpLmluY2x1ZGVzKFwidHJhbnNsYXRlM2RcIikpO1xyXG4gICAgaWYgKCFndWlsZFBpbGwpIHJldHVybjtcclxuICAgIHRoaXMuZ3VpbGRQaWxsUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChndWlsZFBpbGwsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXTtcclxuICAgICAgICBpZiAocHJvcHMudW5yZWFkKSBkYXRhLnJldHVyblZhbHVlLnByb3BzLmNsYXNzTmFtZSArPSBcIiBiZC11bnJlYWRcIjtcclxuICAgICAgICBpZiAocHJvcHMuc2VsZWN0ZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLXNlbGVjdGVkXCI7XHJcbiAgICAgICAgaWYgKHByb3BzLmhvdmVyZWQpIGRhdGEucmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWhvdmVyZWRcIjtcclxuICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcclxuICAgIH19KTtcclxufTtcclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoR3VpbGRTZXBhcmF0b3IgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2gpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiR3VpbGRzXCIpO1xyXG4gICAgY29uc3QgZ3VpbGRDb21wb25lbnRzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJyZW5kZXJMaXN0SXRlbVwiKTtcclxuICAgIGlmICghZ3VpbGRDb21wb25lbnRzIHx8ICFHdWlsZHMpIHJldHVybjtcclxuICAgIGNvbnN0IEd1aWxkU2VwYXJhdG9yID0gZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBndWlsZENvbXBvbmVudHMuU2VwYXJhdG9yKC4uLmFyZ3VtZW50cyk7XHJcbiAgICAgICAgcmV0dXJuVmFsdWUucHJvcHMuY2xhc3NOYW1lICs9IFwiIGJkLWd1aWxkLXNlcGFyYXRvclwiO1xyXG4gICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcclxuICAgIH07XHJcbiAgICB0aGlzLmd1aWxkU2VwYXJhdG9yUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZHMucHJvdG90eXBlLCBcInJlbmRlclwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgZGF0YS5yZXR1cm5WYWx1ZS5wcm9wcy5jaGlsZHJlblsxXS5wcm9wcy5jaGlsZHJlblszXS50eXBlID0gR3VpbGRTZXBhcmF0b3I7XHJcbiAgICB9fSk7XHJcbn07XHJcblxyXG5Db3JlLnByb3RvdHlwZS5wYXRjaEF0dGFjaG1lbnQgPSBmdW5jdGlvbigpIHtcclxuICAgIGlmICh0aGlzLkF0dGFjaG1lbnRQYXRjaCkgcmV0dXJuO1xyXG4gICAgY29uc3QgQXR0YWNobWVudCA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF0dGFjaG1lbnRcIilbMF0gLy8gdGVtcG9yYXJ5XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFBdHRhY2htZW50IHx8ICFBdHRhY2htZW50LmRlZmF1bHQpIHJldHVybjtcclxuICAgIHRoaXMuQXR0YWNobWVudFBhdGNoID0gVXRpbHMubW9ua2V5UGF0Y2goQXR0YWNobWVudCwgXCJkZWZhdWx0XCIsIHthZnRlcjogKGRhdGEpID0+IHtcclxuICAgICAgICBpZighc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTZcIl0pcmV0dXJuXHJcbiAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGRhdGEubWV0aG9kQXJndW1lbnRzWzBdIHx8IG51bGxcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlblwiKTtcclxuXHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXR0YWNobWVudCB8fCAhYXR0YWNobWVudC51cmwpcmV0dXJuXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtcclxuICAgICAgICAgICAgaWQ6IFwiY2VydGlmaWVkLVwiK2lkXHJcbiAgICAgICAgfSkpXHJcbiAgICAgICAgUGx1Z2luQ2VydGlmaWVyLnBhdGNoKGF0dGFjaG1lbnQsIFwiY2VydGlmaWVkLVwiK2lkKVxyXG4gICAgfX0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVzc2FnZUhlYWRlciA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVzc2FnZUhlYWRlclBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZXNzYWdlSGVhZGVyID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJNZXNzYWdlVGltZXN0YW1wXCIpO1xyXG4gICAgY29uc3QgQW5jaG9yID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGlzcGxheU5hbWUgPT0gXCJBbmNob3JcIik7XHJcbiAgICBpZiAoIUFuY2hvciB8fCAhTWVzc2FnZUhlYWRlciB8fCAhTWVzc2FnZUhlYWRlci5kZWZhdWx0KSByZXR1cm47XHJcbiAgICB0aGlzLm1lc3NhZ2VIZWFkZXJQYXRjaCA9IFV0aWxzLm1vbmtleVBhdGNoKE1lc3NhZ2VIZWFkZXIsIFwiZGVmYXVsdFwiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgYXV0aG9yID0gVXRpbHMuZ2V0TmVzdGVkUHJvcChkYXRhLm1ldGhvZEFyZ3VtZW50c1swXSwgXCJtZXNzYWdlLmF1dGhvclwiKTtcclxuICAgICAgICAvLyBjb25zdCBoZWFkZXIgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW4uMS5wcm9wc1wiKTtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5yZXR1cm5WYWx1ZSwgXCJwcm9wcy5jaGlsZHJlbi4xLnByb3BzLmNoaWxkcmVuLjEucHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhYXV0aG9yIHx8ICFhdXRob3IuaWQpcmV0dXJuXHJcbiAgICAgICAgLy8gaWYgKGhlYWRlciAmJiBoZWFkZXIuY2xhc3NOYW1lKSBoZWFkZXIuY2xhc3NOYW1lICs9IFwiIFwiXHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNoaWxkcmVuKSkgcmV0dXJuO1xyXG4gICAgICAgIGlmIChhdXRob3IuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHsgLy8gUmF1ZW56aTogQmFuZGFnZWRCRCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1jaGF0LWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcFwiLCB0aXRsZTogXCJCYW5kYWdlZEJEXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChCRExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoYXV0aG9yLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IGF1dGhvci5pZCA9PT0gXCI2OTYwMDM0NTY2MTEzODUzOTZcIil7IC8vIE5vdCBUaG9taXo6IExpZ2h0Y29yZCBEZXZlbG9wZXIsIFBob3JjeXM6IExpZ2h0Y29yZCBEZXZlbG9wZXJcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiTGlnaHRjb3JkIERldmVsb3BlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7Y2xhc3NOYW1lOiBcImJkLWNoYXQtYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vTGlnaHRjb3JkL0xpZ2h0Y29yZFwiLCB0aXRsZTogXCJMaWdodGNvcmRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZExvZ28sIHtzaXplOiBcIjE2cHhcIiwgY2xhc3NOYW1lOiBcImJkLWxvZ29cIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpZCA9IHV1aWR2NCgpXHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIGlkOiBcImJhZGdlcy1cIitpZCxcclxuICAgICAgICAgICAgICAgIHN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmVcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIClcclxuICAgICAgICBhcHBseUJhZGdlcyhpZCwgYXV0aG9yLCB0cnVlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuZnVuY3Rpb24gYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGNoYXQpe1xyXG4gICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJiYWRnZXMtXCIraWQpXHJcbiAgICAgICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVyblxyXG4gICAgICAgIGlmKGRpdi5jaGlsZE5vZGVzLmxlbmd0aClyZXR1cm5cclxuICAgICAgICBsZXQgYmxvY2tEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXHJcbiAgICAgICAgYmxvY2tEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiXHJcbiAgICAgICAgZGl2LmFwcGVuZENoaWxkKGJsb2NrRGl2KVxyXG5cclxuICAgICAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuXHJcbiAgICAgICAgZGlzdGFudC5nZXRCYWRnZXModXNlci5pZClcclxuICAgICAgICAudGhlbihiYWRnZXMgPT4ge1xyXG4gICAgICAgICAgICBiYWRnZXMuZm9yRWFjaChiYWRnZSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBzdmc6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYmQtbG9nb1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogXCIxNnB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJhZGdlLnNjb3Blcy5mb3JFYWNoKHNjb3BlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihzY29wZSA9PT0gXCJ1c2VyXCIpey8vIHJlcXVpcmUgdXNlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wcy51c2VyID0gdXNlclxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pIFxyXG4gICAgICAgICAgICAgICAgaWYoIWJhZGdlLmhyZWYpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLkFuY2hvciA9IEFuY2hvclxyXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLmhyZWYgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IGJhZGdlLm5hbWV9LFxyXG4gICAgICAgICAgICAgICAgICAgIGJhZGdlLmhyZWYgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQW5jaG9yLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IGJhZGdlLmhyZWYsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY2hhdCA/IFwiYmQtY2hhdC1iYWRnZVwiIDogXCJiZC1tZW1iZXItYmFkZ2VcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBiYWRnZS5uYW1lLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgICAgfSwgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KGJhZGdlLmNvbXBvbmVudCwgcHJvcHMpKSA6IEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChiYWRnZS5jb21wb25lbnQsIHByb3BzKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgY29uc3QgZGl2MiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIilcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKGVsZW1lbnQsIGRpdjIpXHJcbiAgICAgICAgICAgICAgICBkaXYyLmNoaWxkTm9kZXMuZm9yRWFjaChub2RlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQobm9kZSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSlcclxuICAgIH0pXHJcbn1cclxuXHJcbkNvcmUucHJvdG90eXBlLnBhdGNoTWVtYmVyTGlzdCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgaWYgKHRoaXMubWVtYmVyTGlzdFBhdGNoKSByZXR1cm47XHJcbiAgICBjb25zdCBNZW1iZXJMaXN0SXRlbSA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiTWVtYmVyTGlzdEl0ZW1cIik7XHJcbiAgICBjb25zdCBBbmNob3IgPSBXZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kaXNwbGF5TmFtZSA9PSBcIkFuY2hvclwiKTtcclxuICAgIGlmICghQW5jaG9yIHx8ICFNZW1iZXJMaXN0SXRlbSB8fCAhTWVtYmVyTGlzdEl0ZW0ucHJvdG90eXBlIHx8ICFNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUucmVuZGVyRGVjb3JhdG9ycykgcmV0dXJuO1xyXG4gICAgdGhpcy5tZW1iZXJMaXN0UGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChNZW1iZXJMaXN0SXRlbS5wcm90b3R5cGUsIFwicmVuZGVyRGVjb3JhdG9yc1wiLCB7YWZ0ZXI6IChkYXRhKSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS50aGlzT2JqZWN0LCBcInByb3BzLnVzZXJcIik7XHJcbiAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEucmV0dXJuVmFsdWUsIFwicHJvcHMuY2hpbGRyZW5cIik7XHJcbiAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCAhdXNlciB8fCAhdXNlci5pZClyZXR1cm5cclxuICAgICAgICAvLyBpZiAoaGVhZGVyICYmIGhlYWRlci5jbGFzc05hbWUpIGhlYWRlci5jbGFzc05hbWUgKz0gXCIgXCJcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY2hpbGRyZW4pKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHVzZXIuaWQgPT09IFwiMjQ5NzQ2MjM2MDA4MTY5NDczXCIpIHtcclxuICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcclxuICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChUb29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQmFuZGFnZWRCRCBEZXZlbG9wZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEFuY2hvciwge2NsYXNzTmFtZTogXCJiZC1tZW1iZXItYmFkZ2VcIiwgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwXCIsIHRpdGxlOiBcIkJhbmRhZ2VkQkRcIiwgdGFyZ2V0OiBcIl9ibGFua1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KEJETG9nbywge3NpemU6IFwiMTZweFwiLCBjbGFzc05hbWU6IFwiYmQtbG9nb1wifSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh1c2VyLmlkID09PSBcIjY5NjQ4MTE5NDQ0MzAxNDE3NFwiIHx8IHVzZXIuaWQgPT09IFwiNjk2MDAzNDU2NjExMzg1Mzk2XCIpe1xyXG4gICAgICAgICAgICBjaGlsZHJlbi5wdXNoKFxyXG4gICAgICAgICAgICAgICAgQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50KFRvb2x0aXBXcmFwLCB7Y29sb3I6IFwiYmxhY2tcIiwgc2lkZTogXCJ0b3BcIiwgdGV4dDogXCJMaWdodGNvcmQgRGV2ZWxvcGVyXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChBbmNob3IsIHtjbGFzc05hbWU6IFwiYmQtbWVtYmVyLWJhZGdlXCIsIGhyZWY6IFwiaHR0cHM6Ly9naXRodWIuY29tL0xpZ2h0Y29yZC9MaWdodGNvcmRcIiwgdGl0bGU6IFwiTGlnaHRjb3JkXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmRMb2dvLCB7c2l6ZTogXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaWQgPSB1dWlkdjQoKVxyXG4gICAgICAgIGNoaWxkcmVuLnB1c2goXHJcbiAgICAgICAgICAgIEJEVjIuUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IFwiYmFkZ2VzLVwiK2lkfSlcclxuICAgICAgICApXHJcbiAgICAgICAgYXBwbHlCYWRnZXMoaWQsIHVzZXIsIGZhbHNlKVxyXG4gICAgfX0pO1xyXG59O1xyXG5cclxuQ29yZS5wcm90b3R5cGUudXBkYXRlSW5qZWN0b3IgPSBhc3luYyBmdW5jdGlvbigpIHtcclxuICAgIC8vIFRoZXJlIHdpbGwgbmV2ZXIgYmUgYW4gaW5qZWN0aW9uIHBhdGgsIHNvIHdlIGRvIG5vdCBuZWVkIHRoZSBjb2RlIGJlbG93LiBcclxuICAgIC8vIEluc2VydCBjb21tZW50cyBzbyBpdCB3aWxsIGJlIGVyYXNlZCB3aGVuIHByb2R1Y3Rpb24uXHJcbiAgICBcclxuICAgIGNvbnN0IGluamVjdGlvblBhdGggPSBEYXRhU3RvcmUuaW5qZWN0aW9uUGF0aDtcclxuICAgIGlmICghaW5qZWN0aW9uUGF0aCkgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgIC8qXHJcblxyXG4gICAgY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XHJcbiAgICBjb25zdCBybXJmID0gcmVxdWlyZShcInJpbXJhZlwiKTtcclxuICAgIGNvbnN0IHlhdXpsID0gcmVxdWlyZShcInlhdXpsXCIpO1xyXG4gICAgY29uc3QgbWtkaXJwID0gcmVxdWlyZShcIm1rZGlycFwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSByZXF1aXJlKFwicmVxdWVzdFwiKTtcclxuXHJcbiAgICBjb25zdCBwYXJlbnRQYXRoID0gcGF0aC5yZXNvbHZlKGluamVjdGlvblBhdGgsIFwiLi5cIik7XHJcbiAgICBjb25zdCBmb2xkZXJOYW1lID0gcGF0aC5iYXNlbmFtZShpbmplY3Rpb25QYXRoKTtcclxuICAgIGNvbnN0IHppcExpbmsgPSBcImh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JldHRlckRpc2NvcmRBcHAvYXJjaGl2ZS9pbmplY3Rvci56aXBcIjtcclxuICAgIGNvbnN0IHNhdmVkWmlwID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiaW5qZWN0b3IuemlwXCIpO1xyXG4gICAgY29uc3QgZXh0cmFjdGVkRm9sZGVyID0gcGF0aC5yZXNvbHZlKHBhcmVudFBhdGgsIFwiQmV0dGVyRGlzY29yZEFwcC1pbmplY3RvclwiKTtcclxuXHJcbiAgICAvLyBEb3dubG9hZCB0aGUgaW5qZWN0b3IgemlwIGZpbGVcclxuICAgIFV0aWxzLmxvZyhcIkluamVjdG9yVXBkYXRlXCIsIFwiRG93bmxvYWRpbmcgXCIgKyB6aXBMaW5rKTtcclxuICAgIGxldCBzdWNjZXNzID0gYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgcmVxdWVzdC5nZXQoe3VybDogemlwTGluaywgZW5jb2Rpbmc6IG51bGx9LCBhc3luYyAoZXJyb3IsIHJlc3BvbnNlLCBib2R5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvciB8fCByZXNwb25zZS5zdGF0dXNDb2RlICE9PSAyMDApIHJldHVybiByZXNvbHZlKGZhbHNlKTtcclxuICAgICAgICAgICAgLy8gU2F2ZSBhIGJhY2t1cCBpbiBjYXNlIHNvbWVvbmUgaGFzIHRoZWlyIG93biBjb3B5XHJcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4gZnMuZXhpc3RzKHNhdmVkWmlwLCByZXMpKTtcclxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoc2F2ZWRaaXAsIGAke3NhdmVkWmlwfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWAsIHJlcykpO1xyXG5cclxuICAgICAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJXcml0aW5nIFwiICsgc2F2ZWRaaXApO1xyXG4gICAgICAgICAgICBmcy53cml0ZUZpbGUoc2F2ZWRaaXAsIGJvZHksIGVyciA9PiByZXNvbHZlKCFlcnIpKTtcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG4gICAgaWYgKCFzdWNjZXNzKSByZXR1cm4gc3VjY2VzcztcclxuXHJcbiAgICAvLyBDaGVjayBhbmQgZGVsZXRlIHJlbmFtZSBleHRyYWN0aW9uXHJcbiAgICBjb25zdCBhbHJlYWR5RXhpc3RzID0gYXdhaXQgbmV3IFByb21pc2UocmVzID0+IGZzLmV4aXN0cyhleHRyYWN0ZWRGb2xkZXIsIHJlcykpO1xyXG4gICAgaWYgKGFscmVhZHlFeGlzdHMpIGF3YWl0IG5ldyBQcm9taXNlKHJlcyA9PiBmcy5yZW5hbWUoZXh0cmFjdGVkRm9sZGVyLCBgJHtleHRyYWN0ZWRGb2xkZXJ9LmJhayR7TWF0aC5yb3VuZChwZXJmb3JtYW5jZS5ub3coKSl9YCwgcmVzKSk7XHJcbiAgICBcclxuICAgIC8vIFVuemlwIHRoZSBkb3dubG9hZGVkIHppcCBmaWxlXHJcbiAgICBjb25zdCB6aXBmaWxlID0gYXdhaXQgbmV3IFByb21pc2UociA9PiB5YXV6bC5vcGVuKHNhdmVkWmlwLCB7bGF6eUVudHJpZXM6IHRydWV9LCAoZXJyLCB6aXApID0+ICByKHppcCkpKTtcclxuICAgIHppcGZpbGUub24oXCJlbnRyeVwiLCBmdW5jdGlvbihlbnRyeSkge1xyXG4gICAgICAgIC8vIFNraXAgZGlyZWN0b3JpZXMsIHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBta2RpcnBcclxuICAgICAgICBpZiAoZW50cnkuZmlsZU5hbWUuZW5kc1dpdGgoXCIvXCIpKSByZXR1cm4gemlwZmlsZS5yZWFkRW50cnkoKTtcclxuXHJcbiAgICAgICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJFeHRyYWN0aW5nIFwiICsgZW50cnkuZmlsZU5hbWUpO1xyXG4gICAgICAgIC8vIE1ha2UgYW55IG5lZWRlZCBwYXJlbnQgZGlyZWN0b3JpZXNcclxuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBlbnRyeS5maWxlTmFtZSk7XHJcbiAgICAgICAgbWtkaXJwLnN5bmMocGF0aC5kaXJuYW1lKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgemlwZmlsZS5vcGVuUmVhZFN0cmVhbShlbnRyeSwgZnVuY3Rpb24oZXJyLCByZWFkU3RyZWFtKSB7XHJcbiAgICAgICAgICAgIGlmIChlcnIpIHJldHVybiBzdWNjZXNzID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJlYWRTdHJlYW0ub24oXCJlbmRcIiwgZnVuY3Rpb24oKSB7emlwZmlsZS5yZWFkRW50cnkoKTt9KTsgLy8gR28gdG8gbmV4dCBmaWxlIGFmdGVyIHRoaXNcclxuICAgICAgICAgICAgcmVhZFN0cmVhbS5waXBlKGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZ1bGxQYXRoKSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuICAgIHppcGZpbGUucmVhZEVudHJ5KCk7IC8vIFN0YXJ0IHJlYWRpbmdcclxuXHJcbiAgICAvLyBXYWl0IGZvciB0aGUgZmluYWwgZmlsZSB0byBmaW5pc2hcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gemlwZmlsZS5vbmNlKFwiZW5kXCIsIHJlc29sdmUpKTtcclxuXHJcbiAgICAvLyBTYXZlIGEgYmFja3VwIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcgZHVyaW5nIGZpbmFsIHN0ZXBcclxuICAgIGNvbnN0IGJhY2t1cEZvbGRlciA9IHBhdGgucmVzb2x2ZShwYXJlbnRQYXRoLCBgJHtmb2xkZXJOYW1lfS5iYWske01hdGgucm91bmQocGVyZm9ybWFuY2Uubm93KCkpfWApO1xyXG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBmcy5yZW5hbWUoaW5qZWN0aW9uUGF0aCwgYmFja3VwRm9sZGVyLCByZXNvbHZlKSk7XHJcblxyXG4gICAgLy8gUmVuYW1lIHRoZSBleHRyYWN0ZWQgZm9sZGVyIHRvIHdoYXQgaXQgc2hvdWxkIGJlXHJcbiAgICBVdGlscy5sb2coXCJJbmplY3RvclVwZGF0ZVwiLCBgUmVuYW1pbmcgJHtwYXRoLmJhc2VuYW1lKGV4dHJhY3RlZEZvbGRlcil9IHRvICR7Zm9sZGVyTmFtZX1gKTtcclxuICAgIHN1Y2Nlc3MgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IGZzLnJlbmFtZShleHRyYWN0ZWRGb2xkZXIsIGluamVjdGlvblBhdGgsIGVyciA9PiByZXNvbHZlKCFlcnIpKSk7XHJcbiAgICBpZiAoIXN1Y2Nlc3MpIHtcclxuICAgICAgICBVdGlscy5lcnIoXCJJbmplY3RvclVwZGF0ZVwiLCBcIkZhaWxlZCB0byByZW5hbWUgdGhlIGZpbmFsIGRpcmVjdG9yeVwiKTtcclxuICAgICAgICByZXR1cm4gc3VjY2VzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBJZiByZW5hbWUgaGFkIGlzc3VlcywgZGVsZXRlIHdoYXQgd2UgdHJpZWQgdG8gcmVuYW1lIGFuZCByZXN0b3JlIGJhY2t1cFxyXG4gICAgaWYgKCFzdWNjZXNzKSB7XHJcbiAgICAgICAgVXRpbHMuZXJyKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJTb21ldGhpbmcgd2VudCB3cm9uZy4uLiByZXN0b3JpbmcgYmFja3Vwcy5cIik7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBybXJmKGV4dHJhY3RlZEZvbGRlciwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMucmVuYW1lKGJhY2t1cEZvbGRlciwgaW5qZWN0aW9uUGF0aCwgcmVzb2x2ZSkpO1xyXG4gICAgICAgIHJldHVybiBzdWNjZXNzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCBldmVyeXRoaW5nIHNob3VsZCBoYXZlIGdvbmUgc21vb3RobHkuXHJcbiAgICAvLyBDbGVhbnVwIHRoZSBiYWNrdXAgZm9sZGVyIHRoZW4gcmVtb3ZlIHRoZSB6aXBcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gcm1yZihiYWNrdXBGb2xkZXIsIHJlc29sdmUpKTtcclxuICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gZnMudW5saW5rKHNhdmVkWmlwLCByZXNvbHZlKSk7XHJcblxyXG4gICAgVXRpbHMubG9nKFwiSW5qZWN0b3JVcGRhdGVcIiwgXCJJbmplY3RvciBVcGRhdGVkIVwiKTtcclxuICAgIHJldHVybiBzdWNjZXNzOyovXHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgQ29yZSgpO1xyXG5cclxuLyoqXHJcbiAqIERvbid0IGV4cG9zZSBjb3JlIC0gY291bGQgYmUgZGFuZ2Vyb3VzIGZvciBub3dcclxuICovIiwiY29uc3QgX19ub25fd2VicGFja19yZXF1aXJlX18gPSB3aW5kb3cucmVxdWlyZVxyXG5cclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5cclxuY29uc3QgZnMgPSByZXF1aXJlKFwiZnNcIik7XHJcbmNvbnN0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcclxuY29uc3QgcmVsZWFzZUNoYW5uZWwgPSBEaXNjb3JkTmF0aXZlLmdsb2JhbHMgPyBEaXNjb3JkTmF0aXZlLmdsb2JhbHMucmVsZWFzZUNoYW5uZWwgOiBEaXNjb3JkTmF0aXZlLmFwcCA/IERpc2NvcmROYXRpdmUuYXBwLmdldFJlbGVhc2VDaGFubmVsKCkgOiBcInN0YWJsZVwiO1xyXG5cclxubGV0IGRhdGFQYXRoID0gXCJcIjtcclxuaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikgZGF0YVBhdGggPSBwcm9jZXNzLmVudi5BUFBEQVRBO1xyXG5lbHNlIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSBcImRhcndpblwiKSBkYXRhUGF0aCA9IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBcIkxpYnJhcnlcIiwgXCJQcmVmZXJlbmNlc1wiKTtcclxuZWxzZSBkYXRhUGF0aCA9IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA/IHByb2Nlc3MuZW52LlhER19DT05GSUdfSE9NRSA6IHBhdGguam9pbihwcm9jZXNzLmVudi5IT01FLCBcIi5jb25maWdcIik7XHJcbmRhdGFQYXRoID0gcGF0aC5qb2luKGRhdGFQYXRoLCBcIkJldHRlckRpc2NvcmRcIik7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGF0YVN0b3JlIHtcclxuICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuZGF0YSA9IHtzZXR0aW5nczoge3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGEgPSB7fTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuRGF0YVN0b3JlID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIGluaXRpYWxpemUoKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuQkRGaWxlKSkgZnMud3JpdGVGaWxlU3luYyh0aGlzLkJERmlsZSwgSlNPTi5zdHJpbmdpZnkodGhpcy5kYXRhLCBudWxsLCA0KSwgXCJ1dGYtOFwiKTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHRoaXMuQkRGaWxlLCBcInV0Zi04XCIpKVxyXG4gICAgICAgICAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSB0aGlzLmRhdGEgPSBkYXRhO1xyXG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5zZXR0aW5nc0ZpbGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGxldCBzZXR0aW5ncyA9IF9fbm9uX3dlYnBhY2tfcmVxdWlyZV9fKHRoaXMuc2V0dGluZ3NGaWxlKTtcclxuICAgICAgICAgICAgZnMudW5saW5rU3luYyh0aGlzLnNldHRpbmdzRmlsZSk7XHJcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy5oYXNPd25Qcm9wZXJ0eShcInNldHRpbmdzXCIpKSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCB7W3JlbGVhc2VDaGFubmVsXTogc2V0dGluZ3N9KTtcclxuICAgICAgICAgICAgZWxzZSBzZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe3N0YWJsZToge30sIGNhbmFyeToge30sIHB0Yjoge319LCBzZXR0aW5ncyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0QkREYXRhKFwic2V0dGluZ3NcIiwgc2V0dGluZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcclxuICAgICAgICAgICAgVXRpbHMuYWxlcnQoXCJDb3JydXB0IFN0b3JhZ2VcIiwgXCJUaGUgYmQgc3RvcmFnZSBoYXMgc29tZWhvdyBiZWNvbWUgY29ycnVwdC4gWW91IG1heSBlaXRoZXIgdHJ5IHRvIHNhbHZhZ2UgdGhlIGZpbGUgb3IgZGVsZXRlIGl0IHRoZW4gcmVsb2FkLlwiKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGluamVjdGlvblBhdGgoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLl9pbmplY3Rpb25QYXRoKSByZXR1cm4gdGhpcy5faW5qZWN0aW9uUGF0aDtcclxuICAgICAgICBjb25zdCBlbGVjdHJvbiA9IHJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuYXBwO1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBlbGVjdHJvbi5nZXRBcHBQYXRoKCk7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0Jhc2UgPSBlbGVjdHJvbi5nZXRQYXRoKFwidXNlckRhdGFcIik7XHJcbiAgICAgICAgY29uc3Qgcm9hbWluZ0xvY2F0aW9uID0gcGF0aC5yZXNvbHZlKHJvYW1pbmdCYXNlLCBlbGVjdHJvbi5nZXRWZXJzaW9uKCksIFwibW9kdWxlc1wiLCBcImRpc2NvcmRfZGVza3RvcF9jb3JlXCIsIFwiaW5qZWN0b3JcIik7XHJcbiAgICAgICAgY29uc3QgbG9jYXRpb24gPSBwYXRoLnJlc29sdmUoYmFzZSwgXCIuLlwiLCBcImFwcFwiKTtcclxuICAgICAgICBjb25zdCByZWFsTG9jYXRpb24gPSBmcy5leGlzdHNTeW5jKGxvY2F0aW9uKSA/IGxvY2F0aW9uIDogZnMuZXhpc3RzU3luYyhyb2FtaW5nTG9jYXRpb24pID8gcm9hbWluZ0xvY2F0aW9uIDogbnVsbDtcclxuICAgICAgICBpZiAoIXJlYWxMb2NhdGlvbikgcmV0dXJuIHRoaXMuX2luamVjdGlvblBhdGggPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pbmplY3Rpb25QYXRoID0gcmVhbExvY2F0aW9uO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25maWdGaWxlKCkge3JldHVybiB0aGlzLl9jb25maWdGaWxlIHx8ICh0aGlzLl9jb25maWdGaWxlID0gcGF0aC5yZXNvbHZlKHRoaXMuaW5qZWN0aW9uUGF0aCwgXCJiZXR0ZXJkaXNjb3JkXCIsIFwiY29uZmlnLmpzb25cIikpO31cclxuICAgIGdldCBCREZpbGUoKSB7cmV0dXJuIHRoaXMuX0JERmlsZSB8fCAodGhpcy5fQkRGaWxlID0gcGF0aC5yZXNvbHZlKGRhdGFQYXRoLCBcImJkc3RvcmFnZS5qc29uXCIpKTt9XHJcbiAgICBnZXQgc2V0dGluZ3NGaWxlKCkge3JldHVybiB0aGlzLl9zZXR0aW5nc0ZpbGUgfHwgKHRoaXMuX3NldHRpbmdzRmlsZSA9IHBhdGgucmVzb2x2ZShkYXRhUGF0aCwgXCJiZHNldHRpbmdzLmpzb25cIikpO31cclxuICAgIGdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSkge3JldHVybiBwYXRoLnJlc29sdmUoQ29udGVudE1hbmFnZXIucGx1Z2luc0ZvbGRlciwgcGx1Z2luTmFtZSArIFwiLmNvbmZpZy5qc29uXCIpO31cclxuXHJcbiAgICBnZXRTZXR0aW5nR3JvdXAoa2V5KSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZXR0aW5nc1tyZWxlYXNlQ2hhbm5lbF1ba2V5XSB8fCBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNldHRpbmdHcm91cChrZXksIGRhdGEpIHtcclxuICAgICAgICB0aGlzLmRhdGEuc2V0dGluZ3NbcmVsZWFzZUNoYW5uZWxdW2tleV0gPSBkYXRhO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5CREZpbGUsIEpTT04uc3RyaW5naWZ5KHRoaXMuZGF0YSwgbnVsbCwgNCksIFwidXRmLThcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0QkREYXRhKGtleSkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGFba2V5XSB8fCBcIlwiO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJERGF0YShrZXksIHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5kYXRhW2tleV0gPSB2YWx1ZTtcclxuICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRoaXMuQkRGaWxlLCBKU09OLnN0cmluZ2lmeSh0aGlzLmRhdGEsIG51bGwsIDQpLCBcInV0Zi04XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRoaXMuZ2V0UGx1Z2luRmlsZShwbHVnaW5OYW1lKSkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpKSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXVtrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV1ba2V5XSA9IHZhbHVlO1xyXG4gICAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5nZXRQbHVnaW5GaWxlKHBsdWdpbk5hbWUpLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0sIG51bGwsIDQpLCBcInV0Zi04XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGRlbGV0ZVBsdWdpbkRhdGEocGx1Z2luTmFtZSwga2V5KSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSA9PT0gdW5kZWZpbmVkKSB0aGlzLnBsdWdpbkRhdGFbcGx1Z2luTmFtZV0gPSB7fTtcclxuICAgICAgICBkZWxldGUgdGhpcy5wbHVnaW5EYXRhW3BsdWdpbk5hbWVdW2tleV07XHJcbiAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0aGlzLmdldFBsdWdpbkZpbGUocGx1Z2luTmFtZSksIEpTT04uc3RyaW5naWZ5KHRoaXMucGx1Z2luRGF0YVtwbHVnaW5OYW1lXSwgbnVsbCwgNCksIFwidXRmLThcIik7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGV2TW9kZSB7XHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmRlYnVnTGlzdGVuZXIgPSB0aGlzLmRlYnVnTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyID0gdGhpcy5jb3B5U2VsZWN0b3JMaXN0ZW5lci5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSB0aGlzLnN0YXJ0Q29weVNlbGVjdG9yKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wRGVidWdMaXN0ZW5lcigpO1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0RGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICB0aGlzLnN0b3BEZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5kZWJ1Z0xpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wRGVidWdMaXN0ZW5lcigpIHtcclxuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCB0aGlzLmRlYnVnTGlzdGVuZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0Q29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIHRoaXMuc3RvcENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBzdG9wQ29weVNlbGVjdG9yKCkge1xyXG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLCB0aGlzLmNvcHlTZWxlY3Rvckxpc3RlbmVyKTtcclxuICAgIH1cclxuXHJcbiAgICBkZWJ1Z0xpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMTE5IHx8IGUud2hpY2ggPT0gMTE4KSB7Ly9GOFxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIiVjWyVjRGV2TW9kZSVjXSAlY0JyZWFrL1Jlc3VtZVwiLCBcImNvbG9yOiByZWQ7XCIsIFwiY29sb3I6ICMzMDMwMzA7IGZvbnQtd2VpZ2h0OjcwMDtcIiwgXCJjb2xvcjpyZWQ7XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBkZWJ1Z2dlcjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1kZWJ1Z2dlclxyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb3B5U2VsZWN0b3JMaXN0ZW5lcihlKSB7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHRoaXMuZ2V0U2VsZWN0b3IoZS50YXJnZXQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xheWVyLCBcclxuICAgICAgICAgICAgICAgIGNsYXNzSXRlbXNcclxuICAgICAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoKGUpID0+IGUubGF5ZXIgJiYgdHlwZW9mIGUubGF5ZXIgPT09IFwic3RyaW5nXCIgJiYgZS5kaXNhYmxlZFBvaW50ZXJFdmVudHMpWzBdLFxyXG4gICAgICAgICAgICAgICAgQkRNb2R1bGVzLmdldCgoZSkgPT4gZS5tZW51KVswXVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmdW5jdGlvbiBhdHRhY2goKSB7XHJcbiAgICAgICAgICAgICAgICBpZighY2xhc3NJdGVtcyB8fCAhY2xhc3NMYXllci5sYXllcilyZXR1cm4gY29uc29sZS5sb2coY2xhc3NJdGVtcywgY2xhc3NMYXllci5sYXllcilcclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgY20gPSBET00ucXVlcnkoXCIuXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5tZW51KSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudCA+IC5cIitVdGlscy5yZW1vdmVEYShjbGFzc0xheWVyLmxheWVyQ29udGFpbmVyKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY21XcmFwID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzTGF5ZXIubGF5ZXJ9XCI+YCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY20gPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5tZW51fSAke2NsYXNzSXRlbXMuc3R5bGVGbGV4aWJsZX0gJHtjbGFzc0l0ZW1zLmFjY29tbW9kYXRlU2Nyb2xsYmFyfSBiZC1jb250ZXh0LW1lbnVcIiBzdHlsZT1cIlwiPjwvZGl2PmApO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5hcHBlbmQoY20pO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY21XcmFwKTtcclxuICAgICAgICAgICAgICAgICAgICBjbVdyYXAuc3R5bGUudG9wID0gZS5jbGllbnRZICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5sZWZ0ID0gZS5jbGllbnRYICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJyb2xlXCIsIFwibWVudVwiKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgY21XcmFwLmlkID0gXCJiZC1jb3B5LXNlbGVjdG9yLWNvbnRleHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiQ29weSBTZWxlY3RvciBBY3Rpb25zXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyQ2xhc3NlcyA9IEJETW9kdWxlcy5nZXQoKGUpID0+IGUuc2Nyb2xsZXJXcmFwKVswXVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyV3JhcCA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiJHtzY3JvbGxlckNsYXNzZXMuc2Nyb2xsZXJXcmFwfSAke3Njcm9sbGVyQ2xhc3Nlcy5zY3JvbGxlclRoZW1lZH0gJHtzY3JvbGxlckNsYXNzZXMudGhlbWVHaG9zdEhhaXJsaW5lfVwiPjwvZGl2PmApXHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7QkRNb2R1bGVzLmdldChlID0+IGUuc2Nyb2xsZXIpWzBdLnNjcm9sbGVyfSAke2NsYXNzSXRlbXMuc2Nyb2xsZXJ9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlcldyYXAuYXBwZW5kKHNjcm9sbGVyKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtLmFwcGVuZChzY3JvbGxlcldyYXApXHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZUNNID0gZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5rZXlDb2RlICYmIGUua2V5Q29kZSAhPT0gMjcpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY21XcmFwLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHJlbW92ZUNNKTtcclxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIiwgcmVtb3ZlQ00pO1xyXG4gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCByZW1vdmVDTSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbVdyYXAgPSBjbS5wYXJlbnRFbGVtZW50XHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gY20uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWcgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiByb2xlPVwiZ3JvdXBcIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgICAgICogQHR5cGUge0hUTUxFbGVtZW50fVxyXG4gICAgICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgICAgICBjb25zdCBjbWkgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5pdGVtfSAke2NsYXNzSXRlbXMubGFiZWxDb250YWluZXJ9ICR7Y2xhc3NJdGVtcy5jb2xvckRlZmF1bHR9XCIgcm9sZT1cIm1lbnVpdGVtXCIgaWQ9XCJiZC1jb3B5LXNlbGVjdG9yLWl0ZW0tY21cIj48L2Rpdj5gKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hcHBlbmQoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgY2xhc3M9XCIke2NsYXNzSXRlbXMubGFiZWx9XCI+Q29weSBTZWxlY3RvcjwvZGl2PmApKTtcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIuTmF0aXZlTW9kdWxlLmNvcHkoc2VsZWN0b3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCJcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgY21pLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW92ZXJcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHMgPSBET00ucXVlcnlBbGwoXCJkaXZbcm9sZT1tZW51aXRlbV0uXCIrVXRpbHMucmVtb3ZlRGEoY2xhc3NJdGVtcy5mb2N1c2VkKSlcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyAmJiBlbGVtZW50cy5mb3JFYWNoKGVsZW0gPT4gZWxlbS5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzSXRlbXMuZm9jdXNlZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgY21pLmNsYXNzTGlzdC5hZGQoY2xhc3NJdGVtcy5mb2N1c2VkKVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIGNtaS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKGUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjbWkuY2xhc3NMaXN0LnJlbW92ZShjbGFzc0l0ZW1zLmZvY3VzZWQpXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgY21nLmFwcGVuZChjbWkpO1xyXG4gICAgICAgICAgICAgICAgaWYoc2Nyb2xsZXIuY2hpbGROb2Rlcy5sZW5ndGgpeyAvLyBhcGVuZCBhIHNlcGFyYXRvclxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcGFyYXRvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IHJvbGU9XCJzZXBhcmF0b3JcIiBjbGFzcz1cIiR7Y2xhc3NJdGVtcy5zZXBhcmF0b3J9XCI+PC9kaXY+YClcclxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQoc2VwYXJhdG9yKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgc2Nyb2xsZXIuYXBwZW5kKGNtZyk7XHJcbiAgICAgICAgICAgICAgICBpZihjbVdyYXAuY2xpZW50SGVpZ2h0IDwgY21XcmFwLnNjcm9sbEhlaWdodCl7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJvdmVyZmxvd2luZyBcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgICAgIGNtV3JhcC5zdHlsZS50b3AgPSAoY21XcmFwLnN0eWxlLnRvcCAtIGNtZy5jbGllbnRIZWlnaHQpICsgXCJweFwiO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwib3ZlcmZsb3dpbmdcIitjbVdyYXAuc3R5bGUudG9wKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICBcclxuICAgICAgICAgICAgc2V0VGltZW91dChhdHRhY2gsIDEpO1xyXG4gICAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RvcihlbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKGVsZW1lbnQuaWQpIHJldHVybiBgIyR7ZWxlbWVudC5pZH1gO1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIFxyXG4gICAgICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIFxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGxQYXRoKGVsKXtcclxuICAgICAgICAgICAgdmFyIG5hbWVzID0gW107XHJcbiAgICAgICAgICAgIHdoaWxlIChlbC5wYXJlbnROb2RlKXtcclxuICAgICAgICAgICAgICBpZiAoZWwuaWQpe1xyXG4gICAgICAgICAgICAgICAgbmFtZXMudW5zaGlmdCgnIycrZWwuaWQpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWw9PWVsLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBuYW1lcy51bnNoaWZ0KGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKStBcnJheS5mcm9tKGVsLmNsYXNzTGlzdC5lbnRyaWVzKCkpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikpO1xyXG4gICAgICAgICAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgICAgICAgZm9yICh2YXIgYz0xLGU9ZWw7ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO2U9ZS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLGMrKyk7XHJcbiAgICAgICAgICAgICAgICAgIG5hbWVzLnVuc2hpZnQoZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpKygodHlwZW9mIGVsLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbC5jbGFzc05hbWUpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKS5maWx0ZXIoZSA9PiAhIWUpLm1hcChlID0+IFwiLlwiK2UpLmpvaW4oXCJcIikrXCI6bnRoLWNoaWxkKFwiK2MrXCIpXCIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWw9ZWwucGFyZW50Tm9kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVzLmpvaW4oXCIgPiBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmdWxsUGF0aChlbGVtZW50KVxyXG4gICAgfVxyXG59OyIsImV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBEaXNhYmxlVHlwaW5nIHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LnN0YXJ0VHlwaW5nKVxyXG4gICAgICAgIC50aGVuKHR5cGluZ01vZHVsZSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpc1xyXG4gICAgICAgICAgICBjb25zdCBzdGFydFR5cGluZyA9IHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0YXJ0VHlwaW5nID0gZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgICAgIGlmKHNlbGYuZGlzYWJsZWQpcmV0dXJuIHN0YXJ0VHlwaW5nLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN0b3BUeXBpbmcgPSB0eXBpbmdNb2R1bGUuZGVmYXVsdC5zdG9wVHlwaW5nXHJcbiAgICAgICAgICAgIHR5cGluZ01vZHVsZS5kZWZhdWx0LnN0b3BUeXBpbmcgPSBmdW5jdGlvbigpe1xyXG4gICAgICAgICAgICAgICAgaWYoc2VsZi5kaXNhYmxlZClyZXR1cm4gc3RvcFR5cGluZy5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc2FibGVUeXBpbmcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZSgpe1xyXG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlXHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQnVnSHVudGVyQmFkZ2UgZnJvbSBcIi4uL3N2Zy9idWdfaHVudGVyXCJcclxuaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiXHJcbmltcG9ydCB7IHNldHRpbmdzQ29va2llIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDaXJjdXMgZnJvbSBcIi4uL3N2Zy9jaXJjdXNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1dWlkdjQoKSB7IC8vIEdlbmVyYXRlIFVVSUQgKE5vIGNyeXB0byBybmcpXHJcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XHJcbiAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLCB2ID0gYyA9PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xyXG4gICAgICAgIHJldHVybiB2LnRvU3RyaW5nKDE2KTtcclxuICAgIH0pO1xyXG59ICBcclxuXHJcbmNvbnN0IGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXMgPSB7fVxyXG5sZXQgYmFkZ2VzVG9GZXRjaCA9IFtdXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgRGlzdGFudFNlcnZlciB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuX2NhY2hlID0ge1xyXG4gICAgICAgICAgICBiYWRnZXM6IHtcclxuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRpc3RhbnRTZXJ2ZXIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhY2hlKCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlXHJcbiAgICB9XHJcblxyXG4gICAgc2V0IGNhY2hlKGRhdGEpe1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhICE9PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB0aGlzLl9jYWNoZSAhPT0gXCJvYmplY3RcIilyZXR1cm4gdGhpcy5fY2FjaGUgPSBkYXRhXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlID0gT2JqZWN0LmFzc2lnbih0aGlzLl9jYWNoZSwgZGF0YSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldCBjdXN0b20gYmFkZ2VzIGZyb20gdGhlIHVzZXIgSUQuXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXNlciBUaGUgdXNlciBJRCBcclxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnN0YW50c1tcImJhZGdlc1wiXT59XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGdldEJhZGdlcyh1c2VyKXtcclxuICAgICAgICBpZih0aGlzLmNhY2hlLmJhZGdlc1t1c2VyXSlyZXR1cm4gdGhpcy5jYWNoZS5iYWRnZXNbdXNlcl1cclxuICAgICAgICBpZihhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdKXJldHVybiBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdXHJcblxyXG4gICAgICAgIGxldCByZXNvbHZlXHJcbiAgICAgICAgY29uc3QgbmV3UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXMpID0+IChyZXNvbHZlID0gcmVzKSlcclxuICAgICAgICBhd2FpdGluZ0JhZGdlc1Byb21pc2VzW3VzZXJdID0gbmV3UHJvbWlzZVxyXG5cclxuICAgICAgICBjb25zdCBiYWRnZXMgPSBbXVxyXG4gICAgICAgIGZvcihsZXQgYmFkZ2Ugb2YgQ29uc3RhbnRzLmJhZGdlcyl7XHJcbiAgICAgICAgICAgIGlmKGJhZGdlLmRlZmF1bHRVc2Vycy5pbmNsdWRlcyh1c2VyKSliYWRnZXMucHVzaChiYWRnZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZmV0Y2hlZEJhZGdlcyA9IGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXJldHVybiByZXNvbHZlKFtdKVxyXG4gICAgICAgICAgICBiYWRnZXNUb0ZldGNoLnB1c2goW3VzZXIsIHJlc29sdmVdKVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IGJhZGdlc1RvRmV0Y2hcclxuICAgICAgICAgICAgICAgIGlmKHVzZXJzLmxlbmd0aCA9PT0gMClyZXR1cm5cclxuICAgICAgICAgICAgICAgIGJhZGdlc1RvRmV0Y2ggPSBbXVxyXG4gICAgICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChSb3V0ZXMuYmFkZ2VzLCBcIlBPU1RcIiwgSlNPTi5zdHJpbmdpZnkodXNlcnMubWFwKGUgPT4gZVswXSkpKVxyXG4gICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihyZXMuc3RhdHVzICE9PSAyMDApey8vIENvdWxkbid0IGZldGNoIGJhZGdlczogc2VydmVyIGVycm9yXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWzFdKFtdKS8vIHJlc29sdmUgbm8gYmFkZ2UgZmV0Y2hlZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXMuanNvbigpXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCB1c2VyIG9mIHJlc3BvbnNlQm9keSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gdXNlcnMuZmluZChwcm9taXNlID0+IHByb21pc2VbMF0gPT09IHVzZXIudXNlcl9pZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZVsxXSh1c2VyLmJhZGdlcylcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7Ly8gQ291bGRuJ3QgZmV0Y2ggYmFkZ2VzOiBlcnJvclxyXG4gICAgICAgICAgICAgICAgICAgIGlmKCEoZXJyIGluc3RhbmNlb2YgTGlnaHRjb3JkRXJyb3IpKWNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJzLmZvckVhY2goZGF0YSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbMV0oW10pLy8gcmVzb2x2ZSBubyBiYWRnZSBmZXRjaGVkXHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH0sIDApXHJcbiAgICAgICAgfSlcclxuICAgICAgICBmb3IobGV0IGJhZGdlIG9mIGZldGNoZWRCYWRnZXMpe1xyXG4gICAgICAgICAgICBpZighQ29uc3RhbnRzLmJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIFdlIGRvIG5vdCBoYXZlIHRoZSBDb21wb25lbnQsIHNraXAgaXQuXHJcbiAgICAgICAgICAgIGlmKGJhZGdlcy5maW5kKGUgPT4gZS5pZCA9PT0gYmFkZ2UpKWNvbnRpbnVlIC8vIEFscmVhZHkgaW5zZXJ0ZWQuXHJcbiAgICAgICAgICAgIGJhZGdlcy5wdXNoKENvbnN0YW50cy5iYWRnZXMuZmluZChlID0+IGUuaWQgPT09IGJhZGdlKSlcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jYWNoZSA9IHtcclxuICAgICAgICAgICAgYmFkZ2VzOiBPYmplY3QuYXNzaWduKHRoaXMuY2FjaGUuYmFkZ2VzLCB7W3VzZXJdOiBiYWRnZXN9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FjaGUuYmFkZ2VzW3VzZXJdXHJcbiAgICAgICAgfSwgNjAwMDAwKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZShiYWRnZXMpXHJcbiAgICAgICAgZGVsZXRlIGF3YWl0aW5nQmFkZ2VzUHJvbWlzZXNbdXNlcl1cclxuICAgICAgICByZXR1cm4gYmFkZ2VzXHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IGhhbmRsZVJlcXVlc3QgPSBmdW5jdGlvbihyb3V0ZSwgbWV0aG9kLCBkYXRhKXtcclxuICAgIGlmKCFzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC01XCJdKXtcclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IExpZ2h0Y29yZEVycm9yKFwiVGhlIGN1cnJlbnQgc2V0dGluZ3MgYmxvY2tlZCB0aGUgcmVxdWVzdC5cIikpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gbm9kZUZldGNoKGAke0NvbnN0YW50cy5TRVJWRVJfVVJMfS9hcGkvdjEke3JvdXRlfWAsIHtcclxuICAgICAgICBtZXRob2QsXHJcbiAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICBcIkNMSUVOVFwiOiBcIkxpZ2h0Y29yZFwiLFxyXG4gICAgICAgICAgICBcIkF1dGhvcml6YXRpb25cIjogd2luZG93LkxpZ2h0Y29yZC5BcGkuQXV0aG9yaXphdGlvbiB8fCBcIk5vbmU6OkFub255bW91c1wiXHJcbiAgICAgICAgfSxcclxuICAgICAgICAuLi4oZGF0YSA/IHtcclxuICAgICAgICAgICAgYm9keTogZGF0YVxyXG4gICAgICAgIH0gOiB7fSlcclxuICAgIH0pXHJcbn1cclxuXHJcbmNsYXNzIExpZ2h0Y29yZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpXHJcbiAgICAgICAgdGhpcy5uYW1lID0gXCJMaWdodGNvcmRFcnJvclwiXHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBTRVJWRVJfVVJMOiBcImh0dHBzOi8vbGlnaHRjb3JkLmRlcm9rdS54eXpcIixcclxuICAgIGJhZGdlczogWyAvLyBUT0RPOiBBZGQgbW9yZSBiYWRnZXMgKyBzZXJ2ZXIgc2lkZSBzdmdcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkIEJ1ZyBIdW50ZXJcIixcclxuICAgICAgICAgICAgaWQ6IFwiZjA0Njk4ZjUtODE2Yi00MWUzLWJkMDEtOTIyOTExOTNkN2E1XCIsXHJcbiAgICAgICAgICAgIGRlZmF1bHRVc2VyczogW1xyXG4gICAgICAgICAgICAgICAgXCI2OTY0ODExOTQ0NDMwMTQxNzRcIixcclxuICAgICAgICAgICAgICAgIFwiNjk2MDAzNDU2NjExMzg1Mzk2XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBCdWdIdW50ZXJCYWRnZSxcclxuICAgICAgICAgICAgaHJlZjogXCJodHRwczovL2dpdGh1Yi5jb20vbGlnaHRjb3JkL2xpZ2h0Y29yZC93aWtpL2JhZGdlcyNidWdfaHVudGVyXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQnVmZm9vblwiLFxyXG4gICAgICAgICAgICBpZDogXCIwNjkwNGQzMS02NWI0LTQxZWMtYTUwYy04NjU4YmJkMWFmOTZcIixcclxuICAgICAgICAgICAgZGVmYXVsdFVzZXJzOiBbXHJcbiAgICAgICAgICAgICAgICBcIjM4OTAxNjg5NTU0MzcwNTYwMlwiLFxyXG4gICAgICAgICAgICAgICAgXCI2NjQ2MDAxMzQ1Mjg2NjM1NjVcIixcclxuICAgICAgICAgICAgICAgIFwiNjI1MzUwNjU3ODI5ODk2MjI0XCJcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgc2NvcGVzOiBbXSxcclxuICAgICAgICAgICAgY29tcG9uZW50OiBDaXJjdXMsXHJcbiAgICAgICAgICAgIGhyZWY6IFwiaHR0cHM6Ly95b3V0dS5iZS9FSnRiNnotZGxUOD90PTE0NVwiXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgUm91dGVzID0ge1xyXG4gICAgYmFkZ2VzOiBgL3VzZXJzL2JhZGdlc2BcclxufSIsIi8qKlxyXG4gKiBDb3B5cmlnaHQgMjAxOCBaYWNoYXJ5IFJhdWVuXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZ1xyXG4gKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSxcclxuICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcclxuICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZFxyXG4gKiB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIElNUExJRUQsXHJcbiAqIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBXHJcbiAqIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFRcclxuICogSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GXHJcbiAqIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRVxyXG4gKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cclxuICogXHJcbiAqIEZyb206IGh0dHBzOi8vZ2l0aHViLmNvbS9yYXVlbnppL0JEUGx1Z2luTGlicmFyeVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAaW50ZXJmYWNlXHJcbiAqIEBuYW1lIE9mZnNldFxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gdG9wIC0gVG9wIG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByaWdodCAtIFJpZ2h0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBib3R0b20gLSBCb3R0b20gb2Zmc2V0IG9mIHRoZSB0YXJnZXQgZWxlbWVudC5cclxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlZnQgLSBMZWZ0IG9mZnNldCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgLSBPdXRlciBoZWlnaHQgb2YgdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggLSBPdXRlciB3aWR0aCBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAqL1xyXG5cclxuIC8qKlxyXG4gKiBGdW5jdGlvbiB0aGF0IGF1dG9tYXRpY2FsbHkgcmVtb3ZlcyBhZGRlZCBsaXN0ZW5lci5cclxuICogQGNhbGxiYWNrIG1vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lclxyXG4gKi9cclxuIFxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBET01Ub29scyB7XHJcblxyXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XHJcbiAgICAgICAgcmV0dXJuIGlkLnJlcGxhY2UoL15bXmEtel0rfFteXFx3LV0rL2dpLCBcIi1cIik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcblx0ICogQWRkcyBhIHN0eWxlIHRvIHRoZSBkb2N1bWVudC5cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gaWQgLSBpZGVudGlmaWVyIHRvIHVzZSBhcyB0aGUgZWxlbWVudCBpZFxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBjc3MgLSBjc3MgdG8gYWRkIHRvIHRoZSBkb2N1bWVudFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTdHlsZShpZCwgY3NzKSB7XHJcblx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZChET01Ub29scy5jcmVhdGVFbGVtZW50KGA8c3R5bGUgaWQ9XCIke2lkfVwiPiR7Y3NzfTwvc3R5bGU+YCkpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50LlxyXG5cdCAqIEBwYXJhbSB7c3RyaW5nfSBpZCAtIG9yaWdpbmFsIGlkZW50aWZpZXIgdXNlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyByZW1vdmVTdHlsZShpZCkge1xyXG5cdFx0Y29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcclxuXHRcdGlmIChlbGVtZW50KSBlbGVtZW50LnJlbW92ZSgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQWRkcy9yZXF1aXJlcyBhIHJlbW90ZSBzY3JpcHQgdG8gYmUgbG9hZGVkXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gaWRlbnRpZmllciB0byB1c2UgZm9yIHRoaXMgc2NyaXB0XHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IHVybCAtIHVybCBmcm9tIHdoaWNoIHRvIGxvYWQgdGhlIHNjcmlwdFxyXG5cdCAqIEByZXR1cm5zIHtQcm9taXNlfSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2NyaXB0IGlzIGxvYWRlZFxyXG5cdCAqL1xyXG5cdHN0YXRpYyBhZGRTY3JpcHQoaWQsIHVybCkge1xyXG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG5cdFx0XHRjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2NyaXB0XCIpO1xyXG5cdFx0XHRzY3JpcHQuaWQgPSBpZDtcclxuXHRcdFx0c2NyaXB0LnNyYyA9IHVybDtcclxuXHRcdFx0c2NyaXB0LnR5cGUgPSBcInRleHQvamF2YXNjcmlwdFwiO1xyXG5cdFx0XHRzY3JpcHQub25sb2FkID0gcmVzb2x2ZTtcclxuXHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmQoc2NyaXB0KTtcclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVtb3ZlcyBhIHJlbW90ZSBzY3JpcHQgZnJvbSB0aGUgZG9jdW1lbnQuXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IGlkIC0gb3JpZ2luYWwgaWRlbnRpZmllciB1c2VkXHJcblx0ICovXHJcblx0c3RhdGljIHJlbW92ZVNjcmlwdChpZCkge1xyXG4gICAgICAgIGlkID0gdGhpcy5lc2NhcGVJRChpZCk7XHJcblx0XHRjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xyXG5cdFx0aWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlKCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIGh0dHBzOi8vamF2YXNjcmlwdC5pbmZvL2pzLWFuaW1hdGlvblxyXG4gICAgc3RhdGljIGFuaW1hdGUoe3RpbWluZyA9IF8gPT4gXywgdXBkYXRlLCBkdXJhdGlvbn0pIHtcclxuICAgICAgICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xyXG4gICAgICBcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gYW5pbWF0ZSh0aW1lKSB7XHJcbiAgICAgICAgICAvLyB0aW1lRnJhY3Rpb24gZ29lcyBmcm9tIDAgdG8gMVxyXG4gICAgICAgICAgbGV0IHRpbWVGcmFjdGlvbiA9ICh0aW1lIC0gc3RhcnQpIC8gZHVyYXRpb247XHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uID4gMSkgdGltZUZyYWN0aW9uID0gMTtcclxuICAgICAgXHJcbiAgICAgICAgICAvLyBjYWxjdWxhdGUgdGhlIGN1cnJlbnQgYW5pbWF0aW9uIHN0YXRlXHJcbiAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWluZyh0aW1lRnJhY3Rpb24pO1xyXG4gICAgICBcclxuICAgICAgICAgIHVwZGF0ZShwcm9ncmVzcyk7IC8vIGRyYXcgaXRcclxuICAgICAgXHJcbiAgICAgICAgICBpZiAodGltZUZyYWN0aW9uIDwgMSkge1xyXG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoYW5pbWF0ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIG15IHNoaXQgdmVyc2lvbiBvZiBub3QgaGF2aW5nIHRvIHVzZSBgJGAgZnJvbSBqUXVlcnkuIE1lYW5pbmdcclxuICAgICAqIHRoYXQgeW91IGNhbiBwYXNzIGEgc2VsZWN0b3IgYW5kIGl0IHdpbGwgYXV0b21hdGljYWxseSBydW4ge0BsaW5rIG1vZHVsZTpET01Ub29scy5xdWVyeX0uXHJcbiAgICAgKiBJdCBhbHNvIG1lYW5zIHRoYXQgeW91IGNhbiBwYXNzIGEgc3RyaW5nIG9mIGh0bWwgYW5kIGl0IHdpbGwgcGVyZm9ybSBhbmQgcmV0dXJuIGBwYXJzZUhUTUxgLlxyXG4gICAgICogQHNlZSBtb2R1bGU6RE9NVG9vbHMucGFyc2VIVE1MXHJcbiAgICAgKiBAc2VlIG1vZHVsZTpET01Ub29scy5xdWVyeVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnkgb3IgSFRNTCB0byBwYXJzZVxyXG4gICAgICogQHJldHVybnMgeyhEb2N1bWVudEZyYWdtZW50fE5vZGVMaXN0fEhUTUxFbGVtZW50KX0gLSBFaXRoZXIgdGhlIHJlc3VsdCBvZiBgcGFyc2VIVE1MYCBvciBgcXVlcnlgXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBRKHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMucGFyc2VIVE1MKHNlbGVjdG9yKTtcclxuICAgICAgICBjb25zdCBpc0hUTUwgPSBlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QgPyBBcnJheS5mcm9tKGVsZW1lbnQpLnNvbWUobiA9PiBuLm5vZGVUeXBlID09PSAxKSA6IGVsZW1lbnQubm9kZVR5cGUgPT09IDE7XHJcbiAgICAgICAgaWYgKGlzSFRNTCkgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkoc2VsZWN0b3IpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXNzZW50aWFsbHkgYSBzaG9ydGhhbmQgZm9yIGBkb2N1bWVudC5xdWVyeVNlbGVjdG9yYC4gSWYgdGhlIGBiYXNlRWxlbWVudGAgaXMgbm90IHByb3ZpZGVkXHJcbiAgICAgKiBgZG9jdW1lbnRgIGlzIHVzZWQgYnkgZGVmYXVsdC5cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHF1ZXJ5XHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IFtiYXNlRWxlbWVudF0gLSBFbGVtZW50IHRvIGJhc2UgdGhlIHF1ZXJ5IGZyb21cclxuICAgICAqIEByZXR1cm5zIHsoRWxlbWVudHxudWxsKX0gLSBUaGUgZm91bmQgZWxlbWVudCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnkoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFc3NlbnRpYWxseSBhIHNob3J0aGFuZCBmb3IgYGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGxgLiBJZiB0aGUgYGJhc2VFbGVtZW50YCBpcyBub3QgcHJvdmlkZWRcclxuICAgICAqIGBkb2N1bWVudGAgaXMgdXNlZCBieSBkZWZhdWx0LlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gcXVlcnlcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gW2Jhc2VFbGVtZW50XSAtIEVsZW1lbnQgdG8gYmFzZSB0aGUgcXVlcnkgZnJvbVxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIEFycmF5IG9mIGFsbCBmb3VuZCBlbGVtZW50c1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcXVlcnlBbGwoc2VsZWN0b3IsIGJhc2VFbGVtZW50KSB7XHJcbiAgICAgICAgaWYgKCFiYXNlRWxlbWVudCkgYmFzZUVsZW1lbnQgPSBkb2N1bWVudDtcclxuICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJzZXMgYSBzdHJpbmcgb2YgSFRNTCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0cy4gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdHJ1ZSxcclxuICAgICAqIHRoZSBwYXJzZWQgSFRNTCB3aWxsIGJlIHJldHVybmVkIGFzIGEgZG9jdW1lbnQgZnJhZ21lbnQge0BzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50RnJhZ21lbnR9LlxyXG4gICAgICogVGhpcyBpcyBleHRyZW1lbHkgdXNlZnVsIGlmIHlvdSBoYXZlIGEgbGlzdCBvZiBlbGVtZW50cyBhdCB0aGUgdG9wIGxldmVsLCB0aGV5IGNhbiB0aGVuIGJlIGFwcGVuZGVkIGFsbCBhdCBvbmNlIHRvIGFub3RoZXIgbm9kZS5cclxuICAgICAqIFxyXG4gICAgICogSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBsaXN0IG9mIHBhcnNlZFxyXG4gICAgICogbm9kZXMgYW5kIHRoZXJlIHdlcmUgbXVsdGlwbGUgdG9wIGxldmVsIG5vZGVzLCBvdGhlcndpc2UgdGhlIHNpbmdsZSBub2RlIGlzIHJldHVybmVkLlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGh0bWwgLSBIVE1MIHRvIGJlIHBhcnNlZFxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbZnJhZ21lbnQ9ZmFsc2VdIC0gV2hldGhlciBvciBub3QgdGhlIHJldHVybiBzaG91bGQgYmUgdGhlIHJhdyBgRG9jdW1lbnRGcmFnbWVudGBcclxuICAgICAqIEByZXR1cm5zIHsoRG9jdW1lbnRGcmFnbWVudHxOb2RlTGlzdHxIVE1MRWxlbWVudCl9IC0gVGhlIHJlc3VsdCBvZiBIVE1MIHBhcnNpbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHBhcnNlSFRNTChodG1sLCBmcmFnbWVudCA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XHJcbiAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gaHRtbDtcclxuICAgICAgICBjb25zdCBub2RlID0gdGVtcGxhdGUuY29udGVudC5jbG9uZU5vZGUodHJ1ZSk7XHJcbiAgICAgICAgaWYgKGZyYWdtZW50KSByZXR1cm4gbm9kZTtcclxuICAgICAgICByZXR1cm4gbm9kZS5jaGlsZE5vZGVzLmxlbmd0aCA+IDEgPyBub2RlLmNoaWxkTm9kZXMgOiBub2RlLmNoaWxkTm9kZXNbMF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEFsdGVybmF0ZSBuYW1lIGZvciB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLnBhcnNlSFRNTH0gKi9cclxuICAgIHN0YXRpYyBjcmVhdGVFbGVtZW50KGh0bWwsIGZyYWdtZW50ID0gZmFsc2UpIHtyZXR1cm4gdGhpcy5wYXJzZUhUTUwoaHRtbCwgZnJhZ21lbnQpO31cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBUYWtlcyBhIHN0cmluZyBvZiBodG1sIGFuZCBlc2NhcGVzIGl0IHVzaW5nIHRoZSBicm93ZXIncyBvd24gZXNjYXBpbmcgbWVjaGFuaXNtLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGh0bWwgLSBodG1sIHRvIGJlIGVzY2FwZWRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGVzY2FwZUhUTUwoaHRtbCkge1xyXG4gICAgICAgIGNvbnN0IHRleHROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XHJcbiAgICAgICAgY29uc3Qgc3BhbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcclxuICAgICAgICBzcGFuRWxlbWVudC5hcHBlbmQodGV4dE5vZGUpO1xyXG4gICAgICAgIHRleHROb2RlLm5vZGVWYWx1ZSA9IGh0bWw7XHJcbiAgICAgICAgcmV0dXJuIHNwYW5FbGVtZW50LmlubmVySFRNTDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFkZHMgYSBsaXN0IG9mIGNsYXNzZXMgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHsuLi5zdHJpbmd9IGNsYXNzZXMgLSBOYW1lcyBvZiBjbGFzc2VzIHRvIGFkZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgYWRkQ2xhc3MoZWxlbWVudCwgLi4uY2xhc3Nlcykge1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZW1vdmVzIGEgbGlzdCBvZiBjbGFzc2VzIGZyb20gdGhlIHRhcmdldCBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBlZGl0IGNsYXNzZXMgb2ZcclxuICAgICAqIEBwYXJhbSB7Li4uc3RyaW5nfSBjbGFzc2VzIC0gTmFtZXMgb2YgY2xhc3NlcyB0byByZW1vdmVcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIGBlbGVtZW50YCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHJlbW92ZUNsYXNzKGVsZW1lbnQsIC4uLmNsYXNzZXMpIHtcclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGNsYXNzZXMubGVuZ3RoOyBjKyspIGNsYXNzZXNbY10gPSBjbGFzc2VzW2NdLnRvU3RyaW5nKCkuc3BsaXQoXCIgXCIpO1xyXG4gICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZsYXQoKS5maWx0ZXIoYyA9PiBjKTtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoLi4uY2xhc3Nlcyk7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGVuIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByZXNlbnQ6IFRvZ2dsZSBjbGFzcyB2YWx1ZTtcclxuICAgICAqIGkuZS4sIGlmIGNsYXNzIGV4aXN0cyB0aGVuIHJlbW92ZSBpdCBhbmQgcmV0dXJuIGZhbHNlLCBpZiBub3QsIHRoZW4gYWRkIGl0IGFuZCByZXR1cm4gdHJ1ZS5cclxuICAgICAqIFdoZW4gYSBzZWNvbmQgYXJndW1lbnQgaXMgcHJlc2VudDpcclxuICAgICAqIElmIHRoZSBzZWNvbmQgYXJndW1lbnQgZXZhbHVhdGVzIHRvIHRydWUsIGFkZCBzcGVjaWZpZWQgY2xhc3MgdmFsdWUsIGFuZCBpZiBpdCBldmFsdWF0ZXMgdG8gZmFsc2UsIHJlbW92ZSBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZWRpdCBjbGFzc2VzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NuYW1lIC0gTmFtZSBvZiBjbGFzcyB0byB0b2dnbGVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luZGljYXRvcl0gLSBPcHRpb25hbCBpbmRpY2F0b3IgZm9yIGlmIHRoZSBjbGFzcyBzaG91bGQgYmUgdG9nZ2xlZFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NuYW1lLCBpbmRpY2F0b3IpIHtcclxuICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYyk7XHJcbiAgICAgICAgaWYgKHR5cGVvZihpbmRpY2F0b3IpICE9PSBcInVuZGVmaW5lZFwiKSBjbGFzc25hbWUuZm9yRWFjaChjID0+IGVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZShjLCBpbmRpY2F0b3IpKTtcclxuICAgICAgICBlbHNlIGNsYXNzbmFtZS5mb3JFYWNoKGMgPT4gZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGMpKTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrcyBpZiBhbiBlbGVtZW50IGhhcyBhIHNwZWNpZmljIGNsYXNzXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzbmFtZSAtIE5hbWUgb2YgY2xhc3MgdG8gY2hlY2tcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAtIGB0cnVlYCBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIGNsYXNzLCBgZmFsc2VgIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhhc0NsYXNzKGVsZW1lbnQsIGNsYXNzbmFtZSkge1xyXG4gICAgICAgIHJldHVybiBjbGFzc25hbWUudG9TdHJpbmcoKS5zcGxpdChcIiBcIikuZmlsdGVyKGMgPT4gYykuZXZlcnkoYyA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjKSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXBsYWNlcyBvbmUgY2xhc3Mgd2l0aCBhbm90aGVyXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGVkaXQgY2xhc3NlcyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9sZE5hbWUgLSBOYW1lIG9mIGNsYXNzIHRvIHJlcGxhY2VcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdOYW1lIC0gTmV3IG5hbWUgZm9yIHRoZSBjbGFzc1xyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gYGVsZW1lbnRgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcmVwbGFjZUNsYXNzKGVsZW1lbnQsIG9sZE5hbWUsIG5ld05hbWUpIHtcclxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZXBsYWNlKG9sZE5hbWUsIG5ld05hbWUpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwZW5kcyBgdGhpc05vZGVgIHRvIGB0aGF0Tm9kZWBcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBOb2RlIHRvIGJlIGFwcGVuZGVkIHRvIGFub3RoZXIgbm9kZVxyXG4gICAgICogQHBhcmFtIHtOb2RlfSB0aGF0Tm9kZSAtIE5vZGUgZm9yIGB0aGlzTm9kZWAgdG8gYmUgYXBwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBhcHBlbmRUbyh0aGlzTm9kZSwgdGhhdE5vZGUpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRoYXROb2RlKSA9PSBcInN0cmluZ1wiKSB0aGF0Tm9kZSA9IHRoaXMucXVlcnkodGhhdE5vZGUpO1xyXG4gICAgICAgIGlmICghdGhhdE5vZGUpIHJldHVybiBudWxsO1xyXG4gICAgICAgIHRoYXROb2RlLmFwcGVuZCh0aGlzTm9kZSk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNOb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJlcGVuZHMgYHRoaXNOb2RlYCB0byBgdGhhdE5vZGVgXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gTm9kZSB0byBiZSBwcmVwZW5kZWQgdG8gYW5vdGhlciBub2RlXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoYXROb2RlIC0gTm9kZSBmb3IgYHRoaXNOb2RlYCB0byBiZSBwcmVwZW5kZWQgdG9cclxuICAgICAqIEByZXR1cm5zIHtOb2RlfSAtIGB0aGlzTm9kZWAgdG8gYWxsb3cgZm9yIGNoYWluaW5nXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmVwZW5kVG8odGhpc05vZGUsIHRoYXROb2RlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih0aGF0Tm9kZSkgPT0gXCJzdHJpbmdcIikgdGhhdE5vZGUgPSB0aGlzLnF1ZXJ5KHRoYXROb2RlKTtcclxuICAgICAgICBpZiAoIXRoYXROb2RlKSByZXR1cm4gbnVsbDtcclxuICAgICAgICB0aGF0Tm9kZS5wcmVwZW5kKHRoaXNOb2RlKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5pbnNlcnRBZnRlcihvdGhlckVsZW1lbnQpYC5cclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGhpc05vZGUgLSBUaGUgbm9kZSB0byBpbnNlcnRcclxuICAgICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0Tm9kZSAtIE5vZGUgdG8gaW5zZXJ0IGFmdGVyIGluIHRoZSB0cmVlXHJcbiAgICAgKiBAcmV0dXJucyB7Tm9kZX0gLSBgdGhpc05vZGVgIHRvIGFsbG93IGZvciBjaGFpbmluZ1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5zZXJ0QWZ0ZXIodGhpc05vZGUsIHRhcmdldE5vZGUpIHtcclxuICAgICAgICB0YXJnZXROb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXNOb2RlLCB0YXJnZXROb2RlLm5leHRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gdGhpc05vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbnNlcnQgYWZ0ZXIgYSBzcGVjaWZpYyBlbGVtZW50LCBzaW1pbGFyIHRvIGpRdWVyeSdzIGB0aGlzRWxlbWVudC5hZnRlcihuZXdFbGVtZW50KWAuXHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IHRoaXNOb2RlIC0gVGhlIG5vZGUgdG8gaW5zZXJ0XHJcbiAgICAgKiBAcGFyYW0ge05vZGV9IG5ld05vZGUgLSBOb2RlIHRvIGluc2VydCBhZnRlciBpbiB0aGUgdHJlZVxyXG4gICAgICogQHJldHVybnMge05vZGV9IC0gYHRoaXNOb2RlYCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIGFmdGVyKHRoaXNOb2RlLCBuZXdOb2RlKSB7XHJcbiAgICAgICAgdGhpc05vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgdGhpc05vZGUubmV4dFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzTm9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIG5leHQgc2libGluZyBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgbmV4dCBzaWJsaW5nIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gT3B0aW9uYWwgc2VsZWN0b3JcclxuICAgICAqIEByZXR1cm5zIHtFbGVtZW50fSAtIFRoZSBzaWJsaW5nIGVsZW1lbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG5leHQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yID8gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiKyBcIiArIHNlbGVjdG9yKSA6IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgc3Vic2VxdWVudCBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IG5leHQgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dEFsbChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIn4gKlwiKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHN1YnNlcXVlbnQgc2libGluZ3MgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBmb2xsb3dpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgbmV4dFVudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgbmV4dCA9IFtdOyBcclxuICAgICAgICB3aGlsZSAoZWxlbWVudC5uZXh0RWxlbWVudFNpYmxpbmcgJiYgIWVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBuZXh0LnB1c2goZWxlbWVudCA9IGVsZW1lbnQubmV4dEVsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gbmV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgdGhlIHByZXZpb3VzIHNpYmxpbmcgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgdGhlIHByZXZpb3VzIHNpYmxpbmcgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3I9XCJcIl0gLSBPcHRpb25hbCBzZWxlY3RvclxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR9IC0gVGhlIHNpYmxpbmcgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXMoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmc7XHJcbiAgICAgICAgaWYgKHNlbGVjdG9yKSByZXR1cm4gcHJldmlvdXMgJiYgcHJldmlvdXMubWF0Y2hlcyhzZWxlY3RvcikgPyBwcmV2aW91cyA6IG51bGw7XHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgcHJlY2VlZGluZyBzaWJsaW5ncy5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHByZWNlZWRpbmcgc2libGluZ3Mgb2ZcclxuICAgICAqIEByZXR1cm5zIHtOb2RlTGlzdH0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgcHJldmlvdXNBbGwoZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IHByZXZpb3VzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZykgcHJldmlvdXMucHVzaChlbGVtZW50ID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nKTtcclxuICAgICAgICByZXR1cm4gcHJldmlvdXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwcmVjZWVkaW5nIHNpYmxpbmdzIHVudGlsIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCB0aGUgcHJlY2VlZGluZyBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gc3RvcCBhdFxyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIHNpYmxpbmdzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwcmV2aW91c1VudGlsKGVsZW1lbnQsIHNlbGVjdG9yKSB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBbXTsgXHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZyAmJiAhZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nLm1hdGNoZXMoc2VsZWN0b3IpKSBwcmV2aW91cy5wdXNoKGVsZW1lbnQgPSBlbGVtZW50LnByZXZpb3VzRWxlbWVudFNpYmxpbmcpO1xyXG4gICAgICAgIHJldHVybiBwcmV2aW91cztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZpbmQgd2hpY2ggaW5kZXggaW4gY2hpbGRyZW4gYSBjZXJ0YWluIG5vZGUgaXMuIFNpbWlsYXIgdG8galF1ZXJ5J3MgYCQuaW5kZXgoKWBcclxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgLSBUaGUgbm9kZSB0byBmaW5kIGl0cyBpbmRleCBpbiBwYXJlbnRcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IEluZGV4IG9mIHRoZSBub2RlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBpbmRleEluUGFyZW50KG5vZGUpIHtcclxuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGUucGFyZW50Tm9kZS5jaGlsZE5vZGVzO1xyXG4gICAgICAgIGxldCBudW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldID09IG5vZGUpIHJldHVybiBudW07XHJcbiAgICAgICAgICAgIGlmIChjaGlsZHJlbltpXS5ub2RlVHlwZSA9PSAxKSBudW0rKztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBTaG9ydGhhbmQgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMuaW5kZXhJblBhcmVudH0gKi9cclxuICAgIHN0YXRpYyBpbmRleChub2RlKSB7cmV0dXJuIHRoaXMuaW5kZXhJblBhcmVudChub2RlKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBwYXJlbnQgb2YgdGhlIGVsZW1lbnQgaWYgaXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyBudWxsLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgcGFyZW50IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggcGFyZW50XHJcbiAgICAgKiBAcmV0dXJucyB7KEVsZW1lbnR8bnVsbCl9IC0gVGhlIHNpYmxpbmcgZWxlbWVudCBvciBudWxsXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnQoZWxlbWVudCwgc2VsZWN0b3IgPSBcIlwiKSB7XHJcbiAgICAgICAgcmV0dXJuICFzZWxlY3RvciB8fCBlbGVtZW50LnBhcmVudEVsZW1lbnQubWF0Y2hlcyhzZWxlY3RvcikgPyBlbGVtZW50LnBhcmVudEVsZW1lbnQgOiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyBhbGwgY2hpbGRyZW4gb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBjaGlsZHJlbiBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIGNoaWxkcmVuIHRvXHJcbiAgICAgKiBAcmV0dXJucyB7QXJyYXk8RWxlbWVudD59IC0gVGhlIGxpc3Qgb2YgY2hpbGRyZW5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGZpbmRDaGlsZChlbGVtZW50LCBzZWxlY3Rvcikge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCI6c2NvcGUgPiBcIiArIHNlbGVjdG9yKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdldHMgYWxsIGNoaWxkcmVuIG9mIEVsZW1lbnQgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgaWYgcHJvdmlkZWQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGdldCBhbGwgY2hpbGRyZW4gb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIG1hdGNoIHRoZSBjaGlsZHJlbiB0b1xyXG4gICAgICogQHJldHVybnMge0FycmF5PEVsZW1lbnQ+fSAtIFRoZSBsaXN0IG9mIGNoaWxkcmVuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBmaW5kQ2hpbGRyZW4oZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gXCIgKyBzZWxlY3Rvcik7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBhbmNlc3RvcnMgb2YgRWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBpZiBwcm92aWRlZC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBwYXJlbnRzIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlbGVjdG9yPVwiXCJdIC0gU2VsZWN0b3IgdG8gbWF0Y2ggdGhlIHBhcmVudHMgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzKGVsZW1lbnQsIHNlbGVjdG9yID0gXCJcIikge1xyXG4gICAgICAgIGNvbnN0IHBhcmVudHMgPSBbXTtcclxuICAgICAgICBpZiAoc2VsZWN0b3IpIHdoaWxlIChlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50LmNsb3Nlc3Qoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudC5jbG9zZXN0KHNlbGVjdG9yKSk7XHJcbiAgICAgICAgZWxzZSB3aGlsZSAoZWxlbWVudC5wYXJlbnRFbGVtZW50KSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIHRoZSBhbmNlc3RvcnMgdW50aWwgYW4gZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IHRoZSBhbmNlc3RvcnMgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciAtIFNlbGVjdG9yIHRvIHN0b3AgYXRcclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBwYXJlbnRzXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBwYXJlbnRzVW50aWwoZWxlbWVudCwgc2VsZWN0b3IpIHtcclxuICAgICAgICBjb25zdCBwYXJlbnRzID0gW107XHJcbiAgICAgICAgd2hpbGUgKGVsZW1lbnQucGFyZW50RWxlbWVudCAmJiAhZWxlbWVudC5wYXJlbnRFbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpKSBwYXJlbnRzLnB1c2goZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudCk7XHJcbiAgICAgICAgcmV0dXJuIHBhcmVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZXRzIGFsbCBzaWJsaW5ncyBvZiB0aGUgZWxlbWVudCB0aGF0IG1hdGNoIHRoZSBzZWxlY3Rvci5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gZ2V0IGFsbCBzaWJsaW5ncyBvZlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcj1cIipcIl0gLSBTZWxlY3RvciB0byBtYXRjaCB0aGUgc2libGluZ3MgdG9cclxuICAgICAqIEByZXR1cm5zIHtBcnJheTxFbGVtZW50Pn0gLSBUaGUgbGlzdCBvZiBzaWJsaW5nc1xyXG4gICAgICovXHJcbiAgICBzdGF0aWMgc2libGluZ3MoZWxlbWVudCwgc2VsZWN0b3IgPSBcIipcIikge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbikuZmlsdGVyKGUgPT4gZSAhPSBlbGVtZW50ICYmIGUubWF0Y2hlcyhzZWxlY3RvcikpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyBvciBnZXRzIGNzcyBzdHlsZXMgZm9yIGEgc3BlY2lmaWMgZWxlbWVudC4gSWYgYHZhbHVlYCBpcyBwcm92aWRlZFxyXG4gICAgICogdGhlbiBpdCBzZXRzIHRoZSBzdHlsZSBhbmQgcmV0dXJucyB0aGUgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmcsXHJcbiAgICAgKiBvdGhlcndpc2UgcmV0dXJucyB0aGUgc3R5bGUuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgLSBBdHRyaWJ1dGUgdG8gZ2V0IG9yIHNldFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IFt2YWx1ZV0gLSBWYWx1ZSB0byBzZXQgZm9yIGF0dHJpYnV0ZVxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGNzcyhlbGVtZW50LCBhdHRyaWJ1dGUsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIGdsb2JhbC5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW2F0dHJpYnV0ZV07XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZVthdHRyaWJ1dGVdID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIG9yIGdldHMgdGhlIHdpZHRoIGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgd2lkdGggYW5kIHJldHVybnMgdGhlIGVsZW1lbnQgdG8gYWxsb3cgZm9yIGNoYWluaW5nLFxyXG4gICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHdpZHRoLiAgXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHNldCB0aGUgQ1NTIG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3ZhbHVlXSAtIFdpZHRoIHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdpZHRoKGVsZW1lbnQsIHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZih2YWx1ZSkgPT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkud2lkdGgpO1xyXG4gICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgb3IgZ2V0cyB0aGUgaGVpZ2h0IGZvciBhIHNwZWNpZmljIGVsZW1lbnQuIElmIGB2YWx1ZWAgaXMgcHJvdmlkZWRcclxuICAgICAqIHRoZW4gaXQgc2V0cyB0aGUgaGVpZ2h0IGFuZCByZXR1cm5zIHRoZSBlbGVtZW50IHRvIGFsbG93IGZvciBjaGFpbmluZyxcclxuICAgICAqIG90aGVyd2lzZSByZXR1cm5zIHRoZSBoZWlnaHQuICBcclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSBDU1Mgb2ZcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbdmFsdWVdIC0gSGVpZ2h0IHRvIHNldFxyXG4gICAgICogQHJldHVybnMge0VsZW1lbnR8c3RyaW5nfSAtIFdoZW4gc2V0dGluZyBhIHZhbHVlLCBlbGVtZW50IGlzIHJldHVybmVkIGZvciBjaGFpbmluZywgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGhlaWdodChlbGVtZW50LCB2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0eXBlb2YodmFsdWUpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBwYXJzZUludChnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmhlaWdodCk7XHJcbiAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gZWxlbWVudDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNldHMgdGhlIGlubmVyIHRleHQgb2YgYW4gZWxlbWVudCBpZiBnaXZlbiBhIHZhbHVlLCBvdGhlcndpc2UgcmV0dXJucyBpdC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gc2V0IHRoZSB0ZXh0IG9mXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RleHRdIC0gQ29udGVudCB0byBzZXRcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gRWl0aGVyIHRoZSBzdHJpbmcgc2V0IGJ5IHRoaXMgY2FsbCBvciB0aGUgY3VycmVudCB0ZXh0IGNvbnRlbnQgb2YgdGhlIG5vZGUuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyB0ZXh0KGVsZW1lbnQsIHRleHQpIHtcclxuICAgICAgICBpZiAodHlwZW9mKHRleHQpID09IFwidW5kZWZpbmVkXCIpIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50O1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50LnRleHRDb250ZW50ID0gdGV4dDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGlubmVyV2lkdGggb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIGlubmVyIHdpZHRoIG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIHdpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgaW5uZXJXaWR0aChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBpbm5lckhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gcmV0cmlldmUgaW5uZXIgaGVpZ2h0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IC0gVGhlIGlubmVyIGhlaWdodCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIGlubmVySGVpZ2h0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBvdXRlcldpZHRoIG9mIHRoZSBlbGVtZW50LlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byByZXRyaWV2ZSBvdXRlciB3aWR0aCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciB3aWR0aCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgc3RhdGljIG91dGVyV2lkdGgoZWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50Lm9mZnNldFdpZHRoO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgb3V0ZXJIZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJldHJpZXZlIG91dGVyIGhlaWdodCBvZlxyXG4gICAgICogQHJldHVybiB7bnVtYmVyfSAtIFRoZSBvdXRlciBoZWlnaHQgb2YgdGhlIGVsZW1lbnQuXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvdXRlckhlaWdodChlbGVtZW50KSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSBlbGVtZW50IGluIHRoZSBwYWdlLlxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBnZXQgb2Zmc2V0IG9mXHJcbiAgICAgKiBAcmV0dXJuIHtPZmZzZXR9IC0gVGhlIG9mZnNldCBvZiB0aGUgZWxlbWVudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb2Zmc2V0KGVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGxpc3RlbmVycygpIHsgcmV0dXJuIHRoaXMuX2xpc3RlbmVycyB8fCAodGhpcy5fbGlzdGVuZXJzID0ge30pOyB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8galF1ZXJ5J3MgYG9uYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgLlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKGluIHRoZSBgbXlQbHVnaW5gIG5hbWVzcGFjZSkgdG8gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlcyB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9uKGVsZW1lbnQsIFwiY2xpY2subXlQbHVnaW5cIiwgXCIuYmxvY2tcIiwgKCkgPT4ge2NvbnNvbGUubG9nKFwiY2xpY2tlZCFcIik7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgYWRkIGEgY2xpY2sgbGlzdGVuZXIgKHdpdGhvdXQgbmFtZXNwYWNlKSB0byBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub24oZWxlbWVudCwgXCJjbGlja1wiLCAoKSA9PiB7Y29uc29sZS5sb2coXCJjbGlja2VkIVwiKTt9KTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCBhZGQgYSBjbGljayBsaXN0ZW5lciAod2l0aG91dCBuYW1lc3BhY2UpIHRvIGBlbGVtZW50YCB0aGF0IG9ubHkgZmlyZXMgb25jZS5cclxuICAgICAqIGBjb25zdCBjYW5jZWwgPSBET01Ub29scy5vbihlbGVtZW50LCBcImNsaWNrXCIsICgpID0+IHtjb25zb2xlLmxvZyhcImZpcmVkIVwiKTsgY2FuY2VsKCk7fSk7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgLSBFbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0b1xyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IC0gRXZlbnQgdG8gbGlzdGVuIHRvIHdpdGggb3B0aW9uIG5hbWVzcGFjZSAoZS5nLiBcImV2ZW50Lm5hbWVzcGFjZVwiKVxyXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfGNhbGxhYmxlKX0gZGVsZWdhdGUgLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7bW9kdWxlOkRPTVRvb2xzfkNhbmNlbExpc3RlbmVyfSAtIEEgZnVuY3Rpb24gdGhhdCB3aWxsIHVuZG8gdGhlIGxpc3RlbmVyXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyBvbihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGNhbGxiYWNrIDogZnVuY3Rpb24oZXZlbnQpIHtcclxuICAgICAgICAgICAgaWYgKGV2ZW50LnRhcmdldC5tYXRjaGVzKGRlbGVnYXRlKSkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRnVuY3Rpb25hbGl0eSBmb3IgdGhpcyBtZXRob2QgbWF0Y2hlcyB7QGxpbmsgbW9kdWxlOkRPTVRvb2xzLm9ufSBidXQgYXV0b21hdGljYWxseSBjYW5jZWxzIGl0c2VsZlxyXG4gICAgICogYW5kIHJlbW92ZXMgdGhlIGxpc3RlbmVyIHVwb24gdGhlIGZpcnN0IGZpcmluZyBvZiB0aGUgZGVzaXJlZCBldmVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBhZGQgbGlzdGVuZXIgdG9cclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IGRlbGVnYXRlIC0gU2VsZWN0b3IgdG8gcnVuIG9uIGVsZW1lbnQgdG8gbGlzdGVuIHRvXHJcbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbY2FsbGJhY2tdIC0gRnVuY3Rpb24gdG8gZmlyZSBvbiBldmVudFxyXG4gICAgICogQHJldHVybnMge21vZHVsZTpET01Ub29sc35DYW5jZWxMaXN0ZW5lcn0gLSBBIGZ1bmN0aW9uIHRoYXQgd2lsbCB1bmRvIHRoZSBsaXN0ZW5lclxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25jZShlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgY29uc3QgW3R5cGUsIG5hbWVzcGFjZV0gPSBldmVudC5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgY29uc3QgaGFzRGVsZWdhdGUgPSBkZWxlZ2F0ZSAmJiBjYWxsYmFjaztcclxuICAgICAgICBpZiAoIWNhbGxiYWNrKSBjYWxsYmFjayA9IGRlbGVnYXRlO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50RnVuYyA9ICFoYXNEZWxlZ2F0ZSA/IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfSA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmICghZXZlbnQudGFyZ2V0Lm1hdGNoZXMoZGVsZWdhdGUpKSByZXR1cm47XHJcbiAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGV2ZW50RnVuYyk7XHJcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZXZlbnRGdW5jKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGlmIChuYW1lc3BhY2UpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdKSB0aGlzLmxpc3RlbmVyc1tuYW1lc3BhY2VdID0gW107XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0NhbmNlbCA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNhbmNlbCgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5zcGxpY2UodGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5maW5kSW5kZXgobCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQpLCAxKTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnNbbmFtZXNwYWNlXS5wdXNoKHtcclxuICAgICAgICAgICAgICAgIGV2ZW50OiB0eXBlLFxyXG4gICAgICAgICAgICAgICAgZWxlbWVudDogZWxlbWVudCxcclxuICAgICAgICAgICAgICAgIGNhbmNlbDogbmV3Q2FuY2VsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3Q2FuY2VsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gY2FuY2VsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBfX29mZkFsbChldmVudCwgZWxlbWVudCkge1xyXG4gICAgICAgIGNvbnN0IFt0eXBlLCBuYW1lc3BhY2VdID0gZXZlbnQuc3BsaXQoXCIuXCIpO1xyXG4gICAgICAgIGxldCBtYXRjaEZpbHRlciA9IGxpc3RlbmVyID0+IGxpc3RlbmVyLmV2ZW50ID09IHR5cGUsIGRlZmF1bHRGaWx0ZXIgPSBfID0+IF87XHJcbiAgICAgICAgaWYgKGVsZW1lbnQpIG1hdGNoRmlsdGVyID0gbCA9PiBsLmV2ZW50ID09IHR5cGUgJiYgbC5lbGVtZW50ID09IGVsZW1lbnQsIGRlZmF1bHRGaWx0ZXIgPSBsID0+IGwuZWxlbWVudCA9PSBlbGVtZW50O1xyXG4gICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzW25hbWVzcGFjZV0gfHwgW107XHJcbiAgICAgICAgY29uc3QgbGlzdCA9IHR5cGUgPyBsaXN0ZW5lcnMuZmlsdGVyKG1hdGNoRmlsdGVyKSA6IGxpc3RlbmVycy5maWx0ZXIoZGVmYXVsdEZpbHRlcik7XHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBsaXN0Lmxlbmd0aDsgYysrKSBsaXN0W2NdLmNhbmNlbCgpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvKipcclxuICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byBqUXVlcnkncyBgb2ZmYCBmdW5jdGlvbiBhbmQgY2FuICpob3BlZnVsbHkqIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LlxyXG4gICAgICogXHJcbiAgICAgKiBSYXRoZXIgdGhhbiBhdHRlbXB0IHRvIGV4cGxhaW4sIEknbGwgc2hvdyBzb21lIGV4YW1wbGUgdXNhZ2VzLlxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGEgY2xpY2sgbGlzdGVuZXIgY2FsbGVkIGBvbkNsaWNrYCAoaW4gdGhlIGBteVBsdWdpbmAgbmFtZXNwYWNlKSBmcm9tIGBlbGVtZW50YC5cclxuICAgICAqIGBET01Ub29scy5vZmYoZWxlbWVudCwgXCJjbGljay5teVBsdWdpblwiLCBvbkNsaWNrKTtgXHJcbiAgICAgKiBcclxuICAgICAqIFRoZSBmb2xsb3dpbmcgd2lsbCByZW1vdmUgYSBjbGljayBsaXN0ZW5lciBjYWxsZWQgYG9uQ2xpY2tgIChpbiB0aGUgYG15UGx1Z2luYCBuYW1lc3BhY2UpIGZyb20gYGVsZW1lbnRgIHRoYXQgb25seSBmaXJlZCB3aGVuIHRoZSB0YXJnZXQgaXMgYSBgLmJsb2NrYCBlbGVtZW50LlxyXG4gICAgICogYERPTVRvb2xzLm9mZihlbGVtZW50LCBcImNsaWNrLm15UGx1Z2luXCIsIFwiLmJsb2NrXCIsIG9uQ2xpY2spO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhIGNsaWNrIGxpc3RlbmVyICh3aXRob3V0IG5hbWVzcGFjZSkgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiY2xpY2tcIiwgb25DbGljayk7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSBgZWxlbWVudGAuXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKGVsZW1lbnQsIFwiLm15UGx1Z2luXCIpO2BcclxuICAgICAqIFxyXG4gICAgICogVGhlIGZvbGxvd2luZyB3aWxsIHJlbW92ZSBhbGwgY2xpY2sgbGlzdGVuZXJzIGluIG5hbWVzcGFjZSBgbXlQbHVnaW5gIGZyb20gKmFsbCBlbGVtZW50cyouXHJcbiAgICAgKiBgRE9NVG9vbHMub2ZmKFwiY2xpY2subXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMgaW4gbmFtZXNwYWNlIGBteVBsdWdpbmAgZnJvbSAqYWxsIGVsZW1lbnRzKi5cclxuICAgICAqIGBET01Ub29scy5vZmYoXCIubXlQbHVnaW5cIik7YFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geyhFbGVtZW50fHN0cmluZyl9IGVsZW1lbnQgLSBFbGVtZW50IHRvIHJlbW92ZSBsaXN0ZW5lciBmcm9tXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2V2ZW50XSAtIEV2ZW50IHRvIGxpc3RlbiB0byB3aXRoIG9wdGlvbiBuYW1lc3BhY2UgKGUuZy4gXCJldmVudC5uYW1lc3BhY2VcIilcclxuICAgICAqIEBwYXJhbSB7KHN0cmluZ3xjYWxsYWJsZSl9IFtkZWxlZ2F0ZV0gLSBTZWxlY3RvciB0byBydW4gb24gZWxlbWVudCB0byBsaXN0ZW4gdG9cclxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtjYWxsYmFja10gLSBGdW5jdGlvbiB0byBmaXJlIG9uIGV2ZW50XHJcbiAgICAgKiBAcmV0dXJucyB7RWxlbWVudH0gLSBUaGUgb3JpZ2luYWwgZWxlbWVudCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcclxuICAgICAqL1xyXG4gICAgc3RhdGljIG9mZihlbGVtZW50LCBldmVudCwgZGVsZWdhdGUsIGNhbGxiYWNrKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZihlbGVtZW50KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gdGhpcy5fX29mZkFsbChlbGVtZW50KTtcclxuICAgICAgICBjb25zdCBbdHlwZSwgbmFtZXNwYWNlXSA9IGV2ZW50LnNwbGl0KFwiLlwiKTtcclxuICAgICAgICBpZiAobmFtZXNwYWNlKSByZXR1cm4gdGhpcy5fX29mZkFsbChldmVudCwgZWxlbWVudCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGhhc0RlbGVnYXRlID0gZGVsZWdhdGUgJiYgY2FsbGJhY2s7XHJcbiAgICAgICAgaWYgKCFjYWxsYmFjaykgY2FsbGJhY2sgPSBkZWxlZ2F0ZTtcclxuICAgICAgICBjb25zdCBldmVudEZ1bmMgPSAhaGFzRGVsZWdhdGUgPyBjYWxsYmFjayA6IGZ1bmN0aW9uKGV2ZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQubWF0Y2hlcyhkZWxlZ2F0ZSkpIHtcclxuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGV2ZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBldmVudEZ1bmMpO1xyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWRkcyBhIGxpc3RlbmVyIGZvciB3aGVuIHRoZSBub2RlIGlzIGFkZGVkL3JlbW92ZWQgZnJvbSB0aGUgZG9jdW1lbnQgYm9keS5cclxuICAgICAqIFRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgdXBvbiBmaXJpbmcuXHJcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gbm9kZSB0byB3YWl0IGZvclxyXG4gICAgICogQHBhcmFtIHtjYWxsYWJsZX0gY2FsbGJhY2sgLSBmdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQgb24gZXZlbnRcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb25Nb3VudCAtIGRldGVybWluZXMgaWYgaXQgc2hvdWxkIGZpcmUgb24gTW91bnQgb3Igb24gVW5tb3VudFxyXG4gICAgICovXHJcbiAgICBzdGF0aWMgb25Nb3VudENoYW5nZShub2RlLCBjYWxsYmFjaywgb25Nb3VudCA9IHRydWUpIHtcclxuICAgICAgICBjb25zdCB3cmFwcGVkQ2FsbGJhY2sgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXIudW5zdWJzY3JpYmUod3JhcHBlZENhbGxiYWNrKTtcclxuICAgICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIuc3Vic2NyaWJlKHdyYXBwZWRDYWxsYmFjaywgbXV0YXRpb24gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBub2RlcyA9IEFycmF5LmZyb20ob25Nb3VudCA/IG11dGF0aW9uLmFkZGVkTm9kZXMgOiBtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xyXG4gICAgICAgICAgICBjb25zdCBkaXJlY3RNYXRjaCA9IG5vZGVzLmluZGV4T2Yobm9kZSkgPiAtMTtcclxuICAgICAgICAgICAgY29uc3QgcGFyZW50TWF0Y2ggPSBub2Rlcy5zb21lKHBhcmVudCA9PiBwYXJlbnQuY29udGFpbnMobm9kZSkpO1xyXG4gICAgICAgICAgICByZXR1cm4gZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2g7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5vZGU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgdHJ1ZWAgKi9cclxuICAgIHN0YXRpYyBvbk1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2spOyB9XHJcblxyXG4gICAgLyoqIFNob3J0aGFuZCBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50Q2hhbmdlfSB3aXRoIHRoaXJkIHBhcmFtZXRlciBgZmFsc2VgICovXHJcbiAgICBzdGF0aWMgb25Vbm1vdW50KG5vZGUsIGNhbGxiYWNrKSB7IHJldHVybiB0aGlzLm9uTW91bnRDaGFuZ2Uobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKiBBbGlhcyBmb3Ige0BsaW5rIG1vZHVsZTpET01Ub29scy5vbk1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uQWRkZWQobm9kZSwgY2FsbGJhY2spIHsgcmV0dXJuIHRoaXMub25Nb3VudChub2RlLCBjYWxsYmFjayk7IH1cclxuXHJcbiAgICAvKiogQWxpYXMgZm9yIHtAbGluayBtb2R1bGU6RE9NVG9vbHMub25Vbm1vdW50fSAqL1xyXG4gICAgc3RhdGljIG9uUmVtb3ZlZChub2RlLCBjYWxsYmFjaykgeyByZXR1cm4gdGhpcy5vblVubW91bnQobm9kZSwgY2FsbGJhY2ssIGZhbHNlKTsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNvbWJpbmVzIG11bHRpcGxlIGVsZW1lbnRzIGludG8gb25lIHBhcmVudCBlbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge0FycmF5PEhUTUxFbGVtZW50Pn0gZWxlbWVudHMgLSBhcnJheSBvZiBlbGVtZW50cyB0byBwdXQgaW50byBhIHNpbmdsZSBwYXJlbnRcclxuICAgICAqL1xyXG4gICAgc3RhdGljIHdyYXAoZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCBkb21XcmFwcGVyID0gdGhpcy5wYXJzZUhUTUwoYDxkaXYgY2xhc3M9XCJkb20td3JhcHBlclwiPjwvZGl2PmApO1xyXG4gICAgICAgIGZvciAobGV0IGUgPSAwOyBlIDwgZWxlbWVudHMubGVuZ3RoOyBlKyspIGRvbVdyYXBwZXIuYXBwZW5kQ2hpbGQoZWxlbWVudHNbZV0pO1xyXG4gICAgICAgIHJldHVybiBkb21XcmFwcGVyO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzb2x2ZXMgdGhlIG5vZGUgdG8gYW4gSFRNTEVsZW1lbnQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgYnkgbGlicmFyeSBtb2R1bGVzLlxyXG4gICAgICogQHBhcmFtIHsoalF1ZXJ5fEVsZW1lbnQpfSBub2RlIC0gbm9kZSB0byByZXNvbHZlXHJcbiAgICAgKi9cclxuICAgIHN0YXRpYyByZXNvbHZlRWxlbWVudChub2RlKSB7XHJcbiAgICAgICAgaWYgKCEobm9kZSBpbnN0YW5jZW9mIGpRdWVyeSkgJiYgIShub2RlIGluc3RhbmNlb2YgRWxlbWVudCkpIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBqUXVlcnkgPyBub2RlWzBdIDogbm9kZTtcclxuICAgIH1cclxufVxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5CZXR0ZXJEaXNjb3JkLkRPTSA9IERPTVRvb2xzIiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcblxyXG5jb25zdCBDb25zdGFudHMgPSB7XHJcbiAgICBFbW9qaVJlZ2V4OiAvPGE/XFwuKFxcdyspXFwuKFxcZCspPi9nXHJcbn1cclxuXHJcbmxldCBDdXN0b21FbW9qaU1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLkN1c3RvbUVtb2ppKVswXVxyXG5sZXQgRW1vamlNb2R1bGVBcGkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXN0b21FbW9qaUJ5SWQpWzBdXHJcbmxldCBBdXRvY29tcGxldGVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJBdXRvY29tcGxldGVcIilbMF1cclxubGV0IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucylbMF1cclxubGV0IEVtb2ppTW9kdWxlUXVlcnkgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cylbMF1cclxubGV0IE1lc3NhZ2VzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuTWVzc2FnZXMgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzLkVNT0pJX01BVENISU5HKVswXVxyXG5sZXQgZ3VpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRHdWlsZCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzICYmICFlLmRlZmF1bHQuaXNGZXRjaGluZylbMF1cclxubGV0IGVtb2ppU2VhcmNoID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0RGlzYW1iaWd1YXRlZEVtb2ppQ29udGV4dClcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBFbW9qaU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHRoaXMuaW5pdCgpLmNhdGNoKGVyciA9PiBVdGlscy5lcnIoXCJFbW9qaU1vZHVsZVwiLCBcIkFuIGVycm9yIG9jY3VyZWRcIiwgZXJyKSkgLy8gYmV0dGVyIGxvZ2dpbmdcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KCl7XHJcbiAgICAgICAgLyoqIEVtb2ppIEF1dG9Db21wbGV0ZSAqL1xyXG4gICAgICAgIGlmKCFBdXRvY29tcGxldGVNb2R1bGUpQXV0b2NvbXBsZXRlTW9kdWxlID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmRpc3BsYXlOYW1lID09PSBcIkF1dG9jb21wbGV0ZVwiKVxyXG4gICAgICAgIGlmKCFBdXRvQ29tcGxldGlvblRlbXBsYXRlcylBdXRvQ29tcGxldGlvblRlbXBsYXRlcyA9IGF3YWl0IHdpbmRvdy5MaWdodGNvcmQuQXBpLmVuc3VyZUV4cG9ydGVkKGUgPT4gZS5nZXRBdXRvY29tcGxldGVPcHRpb25zKVxyXG4gICAgICAgIGlmKCFFbW9qaU1vZHVsZVF1ZXJ5KUVtb2ppTW9kdWxlUXVlcnkgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQucXVlcnlFbW9qaVJlc3VsdHMpXHJcbiAgICAgICAgaWYoIU1lc3NhZ2VzKU1lc3NhZ2VzID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0Lk1lc3NhZ2VzICYmIGUuZGVmYXVsdC5NZXNzYWdlcy5FTU9KSV9NQVRDSElORylcclxuICAgICAgICBpZighZ3VpbGRNb2R1bGUpZ3VpbGRNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGQgJiYgZS5kZWZhdWx0LmdldEd1aWxkcyAmJiAhZS5kZWZhdWx0LmlzRmV0Y2hpbmcpXHJcbiAgICAgICAgaWYoIWVtb2ppU2VhcmNoKWVtb2ppU2VhcmNoID0gYXdhaXQgd2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldERpc2FtYmlndWF0ZWRFbW9qaUNvbnRleHQpXHJcblxyXG4gICAgICAgIGlmKEF1dG9jb21wbGV0ZU1vZHVsZSAmJiBBdXRvQ29tcGxldGlvblRlbXBsYXRlcyAmJiBFbW9qaU1vZHVsZVF1ZXJ5ICYmIE1lc3NhZ2VzICYmIGd1aWxkTW9kdWxlICYmIGVtb2ppU2VhcmNoKXtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFBhdGNoaW5nIGdldEF1dG9jb21wbGV0ZU9wdGlvbnMgb2YgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXNgLCBBdXRvQ29tcGxldGlvblRlbXBsYXRlcylcclxuICAgICAgICAgICAgY29uc3QgZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IEF1dG9Db21wbGV0aW9uVGVtcGxhdGVzLmdldEF1dG9jb21wbGV0ZU9wdGlvbnNcclxuICAgICAgICAgICAgQXV0b0NvbXBsZXRpb25UZW1wbGF0ZXMuZ2V0QXV0b2NvbXBsZXRlT3B0aW9ucyA9IGZ1bmN0aW9uKGUsIHQsIG4sIHIsIGEpe1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRBdXRvY29tcGxldGVPcHRpb25zLmNhbGwodGhpcywgLi4uYXJndW1lbnRzKVxyXG4gICAgICAgICAgICAgICAgdmFsdWUuTElHSFRDT1JEX0VNT0pJUyA9IHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVzKGFyZzEsIGFyZzIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uID0gYXJnMi5sZW5ndGggPiAxICYmIFwiLlwiID09PSBhcmcxXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldEVtb2ppVXNhYmxlKGNvbmRpdGlvbilcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcXVlcnlSZXN1bHRzKHQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IEVtb2ppTW9kdWxlUXVlcnkuZGVmYXVsdC5xdWVyeUVtb2ppUmVzdWx0cyh0LCBlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0c1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyUmVzdWx0cyhlLCB0LCBuLCByLCBhKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEQoZSwgdCwgYS5lbW9qaXMsIG4sIHIsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSklfTUFUQ0hJTkcsIE1lc3NhZ2VzLmRlZmF1bHQuTWVzc2FnZXMuRU1PSkksIEF1dG9jb21wbGV0ZU1vZHVsZS5kZWZhdWx0LkVtb2ppLCAoZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaTogZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGUuaWQgfHwgZS51bmlxdWVOYW1lIHx8IGUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW50aW5lbDogXCIuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3VpbGQ6IG51bGwgIT0gZS5ndWlsZElkID8gZ3VpbGRNb2R1bGUuZGVmYXVsdC5nZXRHdWlsZChlLmd1aWxkSWQpIDogbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSwgKGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIi5cIiArIGUgKyBcIi5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIGdldFBsYWluVGV4dChpZCwgZ3VpbGQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamlzID0gZ3VpbGQuZW1vamlzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBlbW9qaXMgfHwgbnVsbCA9PSBlbW9qaXNbaWRdKSByZXR1cm4gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVtb2ppID0gZW1vamlzW2lkXSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQW5pbWF0ZWQgPSBlbW9qaS5hbmltYXRlZCA/IFwiYVwiIDogXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVtb2ppLm1hbmFnZWQgfHwgbnVsbCA9PSBlbW9qaS5pZCA/IFwiLlwiICsgZW1vamkubmFtZSArIFwiLlwiIDogXCI8XCIgKyBpc0FuaW1hdGVkICsgXCIuXCIgKyAoZW1vamkub3JpZ2luYWxOYW1lIHx8IGVtb2ppLm5hbWUpICsgXCIuXCIgKyBlbW9qaS5pZCArIFwiPlwiXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBnZXRSYXdUZXh0KGlkLCBndWlsZCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbW9qaXMgPSBndWlsZC5lbW9qaXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChudWxsID09IGVtb2ppcyB8fCBudWxsID09IGVtb2ppc1tpZF0pIHJldHVybiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW1vamkgPSBlbW9qaXNbaWRdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBbmltYXRlZCA9IGVtb2ppLmFuaW1hdGVkID8gXCJhXCIgOiBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW1vamkubWFuYWdlZCB8fCBudWxsID09IGVtb2ppLmlkID8gXCIuXCIgKyBlbW9qaS5uYW1lICsgXCIuXCIgOiBcIjxcIiArIGlzQW5pbWF0ZWQgKyBcIi5cIiArIChlbW9qaS5vcmlnaW5hbE5hbWUgfHwgZW1vamkubmFtZSkgKyBcIi5cIiArIGVtb2ppLmlkICsgXCI+XCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKG5ldyBFcnJvcihcIkNvdWxkbid0IHN0YXJ0IGF1dG9jb21wbGV0aW9uIG9mIExpZ2h0Y29yZCdzIGVtb2ppcy5cIikpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKiogRW1vamkgZGlzcGxheSAqL1xyXG4gICAgICAgIHdoaWxlICghQkRWMi5NZXNzYWdlQ29tcG9uZW50KSBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTAwKSk7XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5jYW5jZWxFbW9qaVJlbmRlcil7IC8vIFRPRE86IFByb3BlciBlbW9qaSBmb3JtYXR0aW5nIC8gcmVuZGVyaW5nXHJcbiAgICAgICAgICAgIHRoaXMuY2FuY2VsRW1vdGVSZW5kZXIgPSBVdGlscy5tb25rZXlQYXRjaChCRFYyLk1lc3NhZ2VDb21wb25lbnQsIFwiZGVmYXVsdFwiLCB7YmVmb3JlOiAoZGF0YSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IFV0aWxzLmdldE5lc3RlZFByb3AoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0sIFwiY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5tZXNzYWdlXCIpXHJcbiAgICAgICAgICAgICAgICBpZighbWVzc2FnZSlyZXR1cm5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBVdGlscy5nZXROZXN0ZWRQcm9wKGRhdGEubWV0aG9kQXJndW1lbnRzWzBdLCBcImNoaWxkcmVuTWVzc2FnZUNvbnRlbnQucHJvcHMuY29udGVudFwiKVxyXG4gICAgICAgICAgICAgICAgaWYoIWNvbnRlbnQgfHwgIWNvbnRlbnQubGVuZ3RoKXJldHVyblxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHt7XHJcbiAgICAgICAgICAgICAgICAgKiAgcmF3OiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgbmFtZTogc3RyaW5nLFxyXG4gICAgICAgICAgICAgICAgICogIGlkOiBzdHJpbmcsXHJcbiAgICAgICAgICAgICAgICAgKiAgYW5pbWF0ZWQ6IGJvb2xlYW5cclxuICAgICAgICAgICAgICAgICAqIH1bXX1cclxuICAgICAgICAgICAgICAgICAqL1xyXG4gICAgICAgICAgICAgICAgbGV0IGVtb2ppcyA9IFtdXHJcbiAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBbXVxyXG4gICAgICAgICAgICAgICAgZm9yKGxldCBub2RlIG9mIGNvbnRlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yobm9kZSkgIT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNQYXJzZWQgPSBmYWxzZVxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIGRvIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkID0gQ29uc3RhbnRzLkVtb2ppUmVnZXguZXhlYyhub2RlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUGFyc2VkID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUVtb2ppTW9kdWxlQXBpKUVtb2ppTW9kdWxlQXBpID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VzdG9tRW1vamlCeUlkKVswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1vamkgPSBFbW9qaU1vZHVsZUFwaS5kZWZhdWx0LmdldEN1c3RvbUVtb2ppQnlJZChwYXJzZWRbMl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihlbW9qaSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogZW1vamkuYW5pbWF0ZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVtb2ppLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3OiBwYXJzZWRbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1vamlzLnB1c2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRlZDogcGFyc2VkWzBdLnN0YXJ0c1dpdGgoXCI8YVwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogcGFyc2VkWzFdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogcGFyc2VkWzJdLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc6IHBhcnNlZFswXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChwYXJzZWQpO1xyXG4gICAgXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoaGFzUGFyc2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29yZHMgPSBub2RlLnNwbGl0KFwiIFwiKS5tYXAoKHdvcmQsIGluZGV4LCBhcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF3b3JkKXJldHVybiBcIlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbW9qaSA9IGVtb2ppcy5maW5kKGUgPT4gZS5yYXcgPT0gd29yZClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFlbW9qaSlyZXR1cm4gd29yZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIUN1c3RvbUVtb2ppTW9kdWxlKUN1c3RvbUVtb2ppTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuQ3VzdG9tRW1vamkpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudChDdXN0b21FbW9qaU1vZHVsZS5DdXN0b21FbW9qaSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAuJHtlbW9qaS5uYW1lfS5gLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbW9qaUlkOiBlbW9qaS5pZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0ZWQ6IGVtb2ppLmFuaW1hdGVkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1ib2FibGU6IGFyci5sZW5ndGggPT09IDEgJiYgY29udGVudC5sZW5ndGggPT09IDFcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoKHByZXZpb3VzLCBjdXJyZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwcmV2aW91cy5sZW5ndGggPT09IDApcmV0dXJuIFtjdXJyZW50XVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcmV2aW91c1twcmV2aW91cy5sZW5ndGggLSAxXSA9PT0gXCJzdHJpbmdcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdICs9IGAgJHtjdXJyZW50fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIrY3VycmVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLnB1c2goXCIgXCIsIGN1cnJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgW10pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCguLi53b3JkcylcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5wdXNoKG5vZGUpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUoZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50WzBdKXtcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLm1ldGhvZEFyZ3VtZW50c1swXS5jaGlsZHJlbk1lc3NhZ2VDb250ZW50LnByb3BzLmNvbnRlbnQuc2hpZnQoKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgd2hpbGUobmV3Q29udGVudFswXSl7XHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5tZXRob2RBcmd1bWVudHNbMF0uY2hpbGRyZW5NZXNzYWdlQ29udGVudC5wcm9wcy5jb250ZW50LnB1c2gobmV3Q29udGVudC5zaGlmdCgpKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9fSk7XHJcbiAgICAgICAgfS8qXHJcbiAgICAgICAgbGV0IHVzZXJNb2R1bGVcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiRW1vamlQaWNrZXJMaXN0Um93XCIpXHJcbiAgICAgICAgLnRoZW4oRW1vamlQaWNrZXJMaXN0Um93ID0+IHtcclxuICAgICAgICAgICAgbGV0IGNsYXNzcyA9IEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0XHJcbiAgICAgICAgICAgIEVtb2ppUGlja2VyTGlzdFJvdy5kZWZhdWx0ID0gY2xhc3MgRW1vamlQaWNrZXJMaXN0Um93IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICAgICAgICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICByZW5kZXIoKXtcclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlck1vZHVsZSl1c2VyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgaWYoIXVzZXJNb2R1bGUpcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCB0aGlzLnByb3BzKVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCB1c2VyID0gdXNlck1vZHVsZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICAgICAgICAgICAgICBpZighdXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uKXJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNsYXNzcywgdGhpcy5wcm9wcylcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY2xhc3NzLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnByb3BzLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtb2ppRGVzY3JpcHRvcnM6IHRoaXMucHJvcHMuZW1vamlEZXNjcmlwdG9ycy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmlzRGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0pKSAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgRW1vamlQaWNrZXJMaXN0Um93LmRlZmF1bHQuZGlzcGxheU5hbWUgPSBcIkVtb2ppUGlja2VyTGlzdFJvd1wiXHJcbiAgICAgICAgfSkqL1xyXG4gICAgfVxyXG5cclxuICAgIGRpc2FibGUoKXtcclxuICAgICAgICBpZiAoIXRoaXMuY2FuY2VsRW1vdGVSZW5kZXIpIHJldHVybjtcclxuICAgICAgICB0aGlzLmNhbmNlbEVtb3RlUmVuZGVyKCk7XHJcbiAgICAgICAgdGhpcy5jYW5jZWxFbW90ZVJlbmRlciA9IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnQoKXtcclxuICAgICAgICBcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gRChlLCB0LCBuLCByLCBvLCBpLCBzLCB1LCBsLCBjKSB7XHJcbiAgICBpZiAobnVsbCA9PSBuIHx8IDAgPT09IG4ubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIHZhciBkID0gbi5tYXAoKGZ1bmN0aW9uKGUsIG4pIHtcclxuICAgICAgICByZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCh1LCBPYmplY3QuYXNzaWduKHtcclxuICAgICAgICAgICAgb25DbGljazogbyxcclxuICAgICAgICAgICAgb25Ib3ZlcjogcixcclxuICAgICAgICAgICAgc2VsZWN0ZWQ6IHQgPT09IG4sXHJcbiAgICAgICAgICAgIGluZGV4OiBuXHJcbiAgICAgICAgfSwgbChlLCBuKSkpXHJcbiAgICB9KSk7XHJcbiAgICByZXR1cm4gW1IoaSwgcywgZSwgYyksIGRdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIFIoZSwgdCwgbiwgcikge1xyXG4gICAgdmFyIGEgPSAobi5sZW5ndGggPiAwID8gZS5mb3JtYXQoe1xyXG4gICAgICAgIHByZWZpeDogcihuKVxyXG4gICAgfSkgOiB0KVxyXG4gICAgaWYoQXJyYXkuaXNBcnJheShhKSl7XHJcbiAgICAgICAgYS51bnNoaWZ0KFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdHJvbmdcIiwge30sIFwiW0xpZ2h0Y29yZF0gXCIpKVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgYSA9IFwiW0xJR0hUQ09SRF0gXCIrYVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQXV0b2NvbXBsZXRlTW9kdWxlLmRlZmF1bHQuVGl0bGUsIHtcclxuICAgICAgICB0aXRsZTogYVxyXG4gICAgfSwgYSlcclxufVxyXG5SLmRpc3BsYXlOYW1lID0gXCJyZW5kZXJIZWFkZXJcIjtcclxuXHJcbmxldCBFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxubGV0IGlzRW1vamlEaXNhYmxlZCA9IEVtb2ppRmlsdGVyTW9kdWxlICYmIEVtb2ppRmlsdGVyTW9kdWxlLmRlZmF1bHQuaXNFbW9qaURpc2FibGVkXHJcbmxldCBpc1VzYWJsZSA9IGZhbHNlXHJcbmxldCBoYXNQYXRjaGVkID0gZmFsc2VcclxuXHJcbmZ1bmN0aW9uIHNldEVtb2ppVXNhYmxlKHVzYWJsZSl7XHJcbiAgICBpc1VzYWJsZSA9IHVzYWJsZVxyXG4gICAgaWYoaGFzUGF0Y2hlZClyZXR1cm5cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlFbW9qaUZpbHRlck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmlzRW1vamlEaXNhYmxlZClbMF1cclxuICAgIGlmKCFFbW9qaUZpbHRlck1vZHVsZSlyZXR1cm5cclxuICAgIGlmKCFpc0Vtb2ppRGlzYWJsZWQpaXNFbW9qaURpc2FibGVkID0gRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWRcclxuXHJcbiAgICBoYXNQYXRjaGVkID0gdHJ1ZVxyXG4gICAgRW1vamlGaWx0ZXJNb2R1bGUuZGVmYXVsdC5pc0Vtb2ppRGlzYWJsZWQgPSBmdW5jdGlvbihlbW9qaSl7XHJcbiAgICAgICAgaWYoaXNVc2FibGUpe1xyXG4gICAgICAgICAgICBpZihlbW9qaS5zdXJyb2dhdGVzIHx8IGVtb2ppLmRpdmVyc2l0eSlyZXR1cm4gdHJ1ZVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRW1vamlEaXNhYmxlZC5jYWxsKHRoaXMsIC4uLmFyZ3VtZW50cylcclxuICAgIH1cclxufSIsImltcG9ydCBub2RlRmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxyXG5pbXBvcnQgKiBhcyBlbGVjdHJvbiBmcm9tIFwiZWxlY3Ryb25cIlxyXG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiXHJcbmltcG9ydCBCRFYyIGZyb20gXCIuL3YyXCJcclxuaW1wb3J0IHRvb2x0aXBXcmFwIGZyb20gXCIuLi91aS90b29sdGlwV3JhcFwiXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiXHJcbmltcG9ydCB7IGNyZWF0ZVJlYWRTdHJlYW0sIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIlxyXG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJwYXRoXCJcclxuaW1wb3J0IGNvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCJcclxuaW1wb3J0IHsgYWRkb25DYWNoZSB9IGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCJcclxuXHJcbmNvbnN0IGNhY2hlID0ge31cclxuY29uc3QgY2FjaGUyID0ge31cclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBQbHVnaW5DZXJ0aWZpZXIge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuUGx1Z2luQ2VydGlmaWVyID0gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHBhdGNoKGF0dGFjaG1lbnQsIGlkKXtcclxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCwgaWQpXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBzdGFydCgpe1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpc1RydXN0ZWQoaGFzaCl7XHJcbiAgICAgICAgcmV0dXJuIGNhY2hlW2hhc2hdICYmICFjYWNoZVtoYXNoXS5zdXNwZWN0XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrLCBmaWxlbmFtZSl7XHJcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIilcclxuICAgIGxldCBpc0hhcm1mdWwgPSBmYWxzZVxyXG4gICAgZm9yKGxldCBrZXl3b3JkIG9mIGRhdGEuc3BsaXQoL1teXFx3XFxkXSsvZykpe1xyXG4gICAgICAgIGZvcihsZXQgb29mIG9mIFtcclxuICAgICAgICAgICAgXCJ0b2tlblwiLFxyXG4gICAgICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgICAgIFwicGhvbmVcIixcclxuICAgICAgICAgICAgXCJNRkFcIixcclxuICAgICAgICAgICAgXCIyZmFcIixcclxuICAgICAgICAgICAgXCJjaGlsZF9wcm9jZXNzXCIsXHJcbiAgICAgICAgICAgIFwibG9jYWxTdG9yYWdlXCIsXHJcbiAgICAgICAgICAgIFwiZXZhbFwiLFxyXG4gICAgICAgICAgICBcImdldEdsb2JhbFwiLFxyXG4gICAgICAgICAgICBcIkJyb3dzZXJXaW5kb3dcIlxyXG4gICAgICAgIF0pe1xyXG4gICAgICAgICAgICBpZihrZXl3b3JkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMob29mLnRvTG93ZXJDYXNlKCkpICYmICFrZXl3b3JkLnRvTG93ZXJDYXNlKCkgPT09IFwiZG9tdG9rZW5saXN0XCIpe1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cob29mLCBrZXl3b3JkKVxyXG4gICAgICAgICAgICAgICAgaXNIYXJtZnVsID0gXCJ0b2tlbiBzdGVhbGVyL3ZpcnVzXCJcclxuICAgICAgICAgICAgICAgIGJyZWFrXHJcbiAgICAgICAgICAgIH0gXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGlzSGFybWZ1bClicmVha1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCFpc0hhcm1mdWwpe1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICAgICAgICovXHJcbiAgICAgICAgY29uc3Qgbm9fY29tbWVudHMgPSBkYXRhLnJlcGxhY2UoL1xcL1xcKltcXHNcXFNdKj9cXCpcXC98KFteXFxcXDpdfF4pXFwvXFwvLiokL2dtLCBcIlwiKS50cmltKCkvLyByZW1vdmluZyB0aGUgTUVUQSBjb21tZW50IGZyb20gcGx1Z2luc1xyXG4gICAgICAgIGlmKCgvdmFyIFtcXHdcXGRfJF0rPVxcW1wiL2dpKS50ZXN0KG5vX2NvbW1lbnRzKSl7XHJcbiAgICAgICAgICAgIGlzSGFybWZ1bCA9IFwib2JmdXNjYXRpb24vaGlkZGVuIGNvZGVcIlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYoIWlzSGFybWZ1bCl7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlZ2V4cHMgPSBbXHJcbiAgICAgICAgICAgICAgICAvKiogaGV4YWRlY2ltYWwgKi9cclxuICAgICAgICAgICAgICAgIC9fMHhcXHd7NH1cXCgnMHhbXFxkYWJjZGVmXSsnXFwpL2csXHJcbiAgICAgICAgICAgICAgICAvXzB4XFx3ezR9XFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIF8weDhkYjcoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgICAgIC8qKiBtYW5nbGVkICovXHJcbiAgICAgICAgICAgICAgICAvXFx3K1xcKCcweFtcXGRhYmNkZWZdKydcXCkvZywgLy8gYignMHgwJylcclxuICAgICAgICAgICAgICAgIC9cXHcrXFwoJzB4W1xcZGFiY2RlZl0rJ1ssIF0rJ1teJ117NH0nXFwpL2csIC8vIGIoJzB4MCcsICd4MV1mJylcclxuICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICBmb3IobGV0IHJlZ2V4IG9mIHJlZ2V4cHMpe1xyXG4gICAgICAgICAgICAgICAgaWYoaXNIYXJtZnVsKWJyZWFrXHJcbiAgICAgICAgICAgICAgICBpZihyZWdleC50ZXN0KG5vX2NvbW1lbnRzKSlpc0hhcm1mdWwgPSBcIm9iZnVzY2F0aW9uL2hpZGRlbiBjb2RlXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZighaXNIYXJtZnVsKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgY2FjaGVbaGFzaF0gPSB7XHJcbiAgICAgICAgc3VzcGVjdDogdHJ1ZSxcclxuICAgICAgICBuYW1lOiBoYXNoVG9VcmxbaGFzaF0uc3BsaXQoXCIvXCIpLnBvcCgpLFxyXG4gICAgICAgIHR5cGU6IGhhc2hUb1VybFtoYXNoXS5lbmRzV2l0aChcIi5qc1wiKSA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCIsXHJcbiAgICAgICAgaGFybTogaXNIYXJtZnVsLFxyXG4gICAgICAgIGhhc2g6IGhhc2gsXHJcbiAgICAgICAgZmlsZW5hbWVcclxuICAgIH1cclxuICAgIFxyXG4gICAgY29uc29sZS5sb2coYEZvdW5kIHBvdGVudGlhbGx5IGRhbmdlcm91cyAke2NhY2hlW2hhc2hdLnR5cGUudG9Mb3dlckNhc2UoKX06ICR7Y2FjaGVbaGFzaF0ubmFtZX1gKVxyXG5cclxuICAgIHJlc3VsdENhbGxiYWNrKGNhY2hlW2hhc2hdKVxyXG59XHJcblxyXG5jb25zdCBoYXNoVG9VcmwgPSB7fVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrSGFzaChoYXNoLCBkYXRhLCBmaWxlbmFtZSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKXtcclxuICAgIGNvbnNvbGUubG9nKGBGaWxlOiAke2ZpbGVuYW1lfSBoYXNoOiAke2hhc2h9YClcclxuICAgIGlmKCFjYWNoZVtoYXNoXSl7XHJcbiAgICAgICAgbm9kZUZldGNoKFwiaHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL0xpZ2h0Y29yZC9maWxlaGFzaGVzQG1hc3Rlci9oYXNoZXMvXCIraGFzaCwgeyAvLyBVc2luZyBub2RlLWZldGNoIHRvIGJ5cGFzcyBjb3JzXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50IC8vIGhhdmUgdG8gc2V0IHVzZXItYWdlbnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXtcclxuICAgICAgICAgICAgICAgIGlmKGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRoZW1lLmNzc1wiKSlyZXR1cm4gcmVtb3ZlQ2FsbGJhY2soaGFzaClcclxuICAgICAgICAgICAgICAgIGNoZWNrVmlydXNlcyhoYXNoLCBkYXRhLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2ssIGZpbGVuYW1lKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICByZXN1bHQuaGFzaCA9IGhhc2hcclxuICAgICAgICAgICAgcmVzdWx0LmZpbGVuYW1lID0gZmlsZW5hbWVcclxuXHJcbiAgICAgICAgICAgIGNhY2hlW2hhc2hdID0gcmVzdWx0XHJcblxyXG4gICAgICAgICAgICByZXN1bHRDYWxsYmFjayhyZXN1bHQpXHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgcmVhZCBmcm9tIGdpdGh1Yi4gJHtlcnJ9YClcclxuICAgICAgICAgICAgaWYoZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiByZW1vdmVDYWxsYmFjayhoYXNoKVxyXG4gICAgICAgICAgICBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrLCBmaWxlbmFtZSlcclxuICAgICAgICB9KVxyXG4gICAgfWVsc2V7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF1cclxuXHJcbiAgICAgICAgcmVzdWx0Q2FsbGJhY2socmVzdWx0KVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc0ZpbGUoX19wYXRoLCByZXN1bHRDYWxsYmFjaywgcmVtb3ZlQ2FsbGJhY2sgPSAoaGFzaCkgPT4ge30sIGlzRnJvbUxvYWRlciA9IGZhbHNlKXsgICAgXHJcbiAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJzaGEyNTZcIilcclxuICAgIGxldCBkYXRhID0gQnVmZmVyLmFsbG9jKDApXHJcblxyXG4gICAgY3JlYXRlUmVhZFN0cmVhbShfX3BhdGgpLm9uKFwiZGF0YVwiLCBjaHVuayA9PiB7XHJcbiAgICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSlcclxuICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgIH0pLm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICBjb25zdCBoYXNoUmVzdWx0ID0gaGFzaC5kaWdlc3QoXCJoZXhcIilcclxuXHJcbiAgICAgICAgaGFzaFRvVXJsW2hhc2hSZXN1bHRdID0gX19wYXRoXHJcblxyXG4gICAgICAgIGlmKGlzRnJvbUxvYWRlciAmJiBhZGRvbkNhY2hlW2hhc2hSZXN1bHRdKXtcclxuICAgICAgICAgICAgbGV0IHZhbHVlID0gYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICBpZih2YWx1ZS50aW1lc3RhbXAgPCAoRGF0ZS5ub3coKSAtIDYuMDQ4ZSs4KSl7XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgYWRkb25DYWNoZVtoYXNoUmVzdWx0XVxyXG4gICAgICAgICAgICAgICAgY29udGVudE1hbmFnZXIuc2F2ZUFkZG9uQ2FjaGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKHZhbHVlLnJlc3VsdClcclxuICAgICAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjaGVja0hhc2goaGFzaFJlc3VsdCwgZGF0YSwgYmFzZW5hbWUoX19wYXRoKSwgcmVzdWx0Q2FsbGJhY2ssIHJlbW92ZUNhbGxiYWNrKVxyXG4gICAgfSlcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQsIGlkKXtcclxuICAgIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpcmV0dXJuXHJcbiAgICBpZighYXR0YWNobWVudC51cmwuc3RhcnRzV2l0aChcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL1wiKSlyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLnJlbW92ZSgpXHJcbiAgICBpZighYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKXJldHVybiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkucmVtb3ZlKClcclxuXHJcbiAgICBub2RlRmV0Y2goYXR0YWNobWVudC51cmwsIHtcclxuICAgICAgICBoZWFkZXJzOiB7XHJcbiAgICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpXHJcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKFwic2hhMjU2XCIpXHJcbiAgICAgICAgbGV0IGRhdGEgPSBCdWZmZXIuYWxsb2MoMClcclxuICAgICAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xyXG4gICAgICAgICAgICBkYXRhID0gQnVmZmVyLmNvbmNhdChbZGF0YSwgY2h1bmtdKVxyXG4gICAgICAgICAgICBoYXNoLnVwZGF0ZShjaHVuaylcclxuICAgICAgICB9KVxyXG4gICAgICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpXHJcblxyXG4gICAgICAgICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdFxyXG4gICAgICAgICAgICBoYXNoVG9VcmxbaGFzaFJlc3VsdF0gPSBhdHRhY2htZW50LnVybFxyXG5cclxuICAgICAgICAgICAgY2hlY2tIYXNoKGhhc2hSZXN1bHQsIGRhdGEsIGF0dGFjaG1lbnQuZmlsZW5hbWUsIChyZXN1bHQpID0+IHtcclxuICAgICAgICAgICAgICAgIHJlbmRlclRvRWxlbWVudHMoaWQsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSlcclxuICAgICAgICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcclxuICAgICAgICAgICAgICAgIGlmKGVsZW0pZWxlbS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICB9KS5jYXRjaCgoKT0+e30pXHJcbn1cclxuXHJcbmxldCBmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxubGV0IGNoaWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY2hpbGRDb250YWluZXIpWzBdXHJcblxyXG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXHJcbiAqIEBwYXJhbSB7e3R5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIG9mZmljaWFsPzogYm9vbGVhbn18e3N1c3BlY3Q6dHJ1ZSwgdHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZywgaGFybTogc3RyaW5nfX0gcmVzdWx0XHJcbiAqL1xyXG5mdW5jdGlvbiByZW5kZXJUb0VsZW1lbnRzKGlkLCByZXN1bHQsIGZpbGVuYW1lKXtcclxuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxyXG4gICAgaWYoIWRpdiB8fCBkaXYuY2hpbGROb2Rlcy5sZW5ndGggPiAwKXJldHVybiAvLyBhbHJlYWR5IGNlcnRpZmllZC9kaXYgZG9lcyBub3QgZXhpc3QgYW55bW9yZS5cclxuXHJcbiAgICBpZighZmxvd2VyU3Rhck1vZHVsZSlmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF1cclxuICAgIGlmKCFjaGlsZE1vZHVsZSljaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXVxyXG4gICAgXHJcbiAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICBkaXYucGFyZW50Tm9kZS5zdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgIC8qKlxyXG4gICAgICAgICAgICAgKiBcclxuICAgICAgICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gbm9kZSBcclxuICAgICAgICAgICAgICovXHJcbiAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IobGV0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pe1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09IFwiQVwiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZG93bmxvYWQgdGhpcyA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhlIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgKipcIitmaWxlbmFtZStcIioqIG1pZ2h0IGJlIGRhbmdlcm91cyAqKihcIityZXN1bHQuaGFybStcIikqKi4gXFxuXFxuKipXZSBkb24ndCByZWNvbW1hbmQgdG8gZG93bmxvYWQgaXQqKi4gSG93ZXZlciwgeW91IGNhbiBzdGlsbCBkbyBpdCBiZWxvdy5cIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBBbnl3YXlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJEb24ndCAhXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw6ICgpID0+IHt9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZWN0cm9uLnJlbW90ZS5zaGVsbC5vcGVuRXh0ZXJuYWwoY2hpbGQuaHJlZilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHROb2RlKGNoaWxkKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXh0Tm9kZShkaXYucGFyZW50Tm9kZSlcclxuICAgICAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHRvb2x0aXBXcmFwLCB7dGV4dDogcmVzdWx0LnR5cGUrXCIgXCIrcmVzdWx0Lm5hbWUrXCIgaXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzLlwifSwgXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogQkRNb2R1bGVzLmdldChlID0+IGUuc3ZnKVswXS5zdmcsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgNDAgMzJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicmVjdFwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHk6XCIwXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OlwiMzJcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stYXZhdGFyLXN0YXR1cy1yb3VuZC0zMilcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbDpcIiNmMDQ3NDdcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgbWFzazpcInVybCgjc3ZnLW1hc2stc3RhdHVzLWRuZClcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOkJETW9kdWxlcy5nZXQoZSA9PiBlLnBvaW50ZXJFdmVudHMpWzBdLnBvaW50ZXJFdmVudHNcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKSwgZGl2KVxyXG4gICAgfWVsc2UgaWYoIXJlc3VsdC5vZmZpY2lhbCl7XHJcbiAgICAgICAgZGl2LnBhcmVudE5vZGUuc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgIGxldCBzcGFuID0gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7c3R5bGU6IHtkaXNwbGF5OiBcImluaGVyaXRcIn19LCBbXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IHJlc3VsdC50eXBlK1wiIFwiK3Jlc3VsdC5uYW1lK1wiIGlzIGNlcnRpZmllZCBieSBMaWdodGNvcmQuXCJ9LCBcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsIHN0eWxlOiB7d2lkdGg6IFwiMjBweFwiLCBoZWlnaHQ6IFwiMjBweFwiLCBmbG9hdDogXCJsZWZ0XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLCBcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjNGY1NDVjXCIsIFwiZmlsbC1ydWxlXCI6XCJldmVub2RkXCIsZDpcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwiLHdpZHRoOlwiMjBweFwiLGhlaWdodDpcIjIwcHhcIix2aWV3Qm94OlwiMCAwIDE2IDE1LjJcIn0sIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcIiNmZmZmZmZcIixkOlwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBhbmQgbGF1bmNoIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIi4gWW91IGRvbid0IGhhdmUgYW55dGhpbmcgdG8gZG8uXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maXJtVGV4dDogXCJEb3dubG9hZCBhbmQgSW5zdGFsbFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsVGV4dDogXCJJJ3ZlIGNoYW5nZWQgbXkgbWluZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGFuZ2VyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsOiAoKSA9PiB7fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ29uZmlybTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5rID0gZ2V0S2V5ZWRBcnJheShjYWNoZTIpLmZpbmQoZSA9PiBlWzFdID09PSByZXN1bHQuaGFzaClbMF1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVGZXRjaChsaW5rKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBuZXcgRXJyb3IoXCJTdGF0dXMgd2FzIG5vdCAyMDBcIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBhd2FpdCByZXMuYnVmZmVyKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluc3RhbGxQYXRoID0gam9pbihyZXN1bHQudHlwZSA9PT0gXCJQbHVnaW5cIiA/IGNvbnRlbnRNYW5hZ2VyLl9wbHVnaW5zRm9sZGVyIDogY29udGVudE1hbmFnZXIuX3RoZW1lc0ZvbGRlciwgcmVzdWx0LmZpbGVuYW1lKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhpbnN0YWxsUGF0aClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhpbnN0YWxsUGF0aCwgY29udGVudClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KHJlc3VsdC50eXBlK1wiIHN1Y2Nlc2Z1bGx5IGluc3RhbGxlZC5cIilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyciA6IG5ldyBFcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChlcnIubWVzc2FnZSwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJlcnJvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMjQgMjRcIixzdHlsZTp7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcInJnYig2NywgMTgxLCAxMjkpXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcjogXCJwb2ludGVyXCJcclxuICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgPGcgZmlsbD1cIm5vbmVcIiBmaWxsLXJ1bGU9XCJldmVub2RkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGNsYXNzPVwiZmlsbFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIiBkPVwiTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZz5cclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICBdKVxyXG4gICAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKHNwYW4sIGRpdilcclxuICAgIH1lbHNle1xyXG4gICAgICAgIGRpdi5wYXJlbnROb2RlLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjNDA4N2VkXCJcclxuICAgICAgICBsZXQgc3BhbiA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZGlzcGxheTogXCJpbmhlcml0XCJ9fSwgW1xyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHt0ZXh0OiByZXN1bHQudHlwZStcIiBcIityZXN1bHQubmFtZStcIiB3YXMgbWFkZSBieSB0aGUgZGV2ZWxvcGVycyBvZiBMaWdodGNvcmQuXCIsIHN0eWxlOlwiYnJhbmRcIn0sIFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lciwgc3R5bGU6IHt3aWR0aDogXCIyMHB4XCIsIGhlaWdodDogXCIyMHB4XCIsIGZsb2F0OiBcImxlZnRcIn19LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7Y2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsIFwiYXJpYS1oaWRkZW5cIjpcImZhbHNlXCIsd2lkdGg6XCIyMHB4XCIsaGVpZ2h0OlwiMjBweFwiLHZpZXdCb3g6XCIwIDAgMTYgMTUuMlwiLHN0cm9rZTpcIiMzNjM5M2ZcIixzdHlsZTp7Y29sb3I6XCIjNDA4N2VkXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDpcImN1cnJlbnRDb2xvclwiLCBcImZpbGwtcnVsZVwiOlwiZXZlbm9kZFwiLGQ6XCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyfSwgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAxNiAxNS4yXCJ9LCBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2ZpbGw6XCIjZmZmZmZmXCIsZDpcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge3RleHQ6IFwiSW5zdGFsbCB0aGlzIFwiK3Jlc3VsdC50eXBlLnRvTG93ZXJDYXNlKCkrXCIgb24gTGlnaHRjb3JkLlwifSwgXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLCBzdHlsZToge3dpZHRoOiBcIjIwcHhcIiwgaGVpZ2h0OiBcIjIwcHhcIn0sIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93Q29uZmlybWF0aW9uTW9kYWwoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRvd25sb2FkIHRoaXMgXCIrcmVzdWx0LnR5cGUudG9Mb3dlckNhc2UoKStcIiA/XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkxpZ2h0Y29yZCB3aWxsIGF1dG9tYXRpY2FsbHkgZG93bmxvYWQgYW5kIGxvYWQgdGhpcyBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBZb3UgbXVzdCBlbmFibGUgaXQgaW4gdGhlIHNldHRpbmdzLlwiLCBcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRG93bmxvYWQgYW5kIEluc3RhbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IFwiSSd2ZSBjaGFuZ2VkIG15IG1pbmRcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhbmdlcjogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluayA9IGdldEtleWVkQXJyYXkoY2FjaGUyKS5maW5kKGUgPT4gZVsxXSA9PT0gcmVzdWx0Lmhhc2gpWzBdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZldGNoKGxpbmspXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oYXN5bmMgcmVzID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocmVzLnN0YXR1cyAhPT0gMjAwKXRocm93IG5ldyBFcnJvcihcIlN0YXR1cyB3YXMgbm90IDIwMFwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IGF3YWl0IHJlcy5idWZmZXIoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFsbFBhdGggPSBqb2luKHJlc3VsdC50eXBlID09PSBcIlBsdWdpblwiID8gY29udGVudE1hbmFnZXIuX3BsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci5fdGhlbWVzRm9sZGVyLCByZXN1bHQuZmlsZW5hbWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZpbGVTeW5jKGluc3RhbGxQYXRoLCBjb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QocmVzdWx0LnR5cGUrXCIgc3VjY2VzZnVsbHkgaW5zdGFsbGVkLlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyIDogbmV3IEVycm9yKGVycilcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KGVyci5tZXNzYWdlLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhciwgXCJhcmlhLWhpZGRlblwiOlwiZmFsc2VcIix3aWR0aDpcIjIwcHhcIixoZWlnaHQ6XCIyMHB4XCIsdmlld0JveDpcIjAgMCAyNCAyNFwiLHN0eWxlOntcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IFwicmdiKDY3LCAxODEsIDEyOSlcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZyBmaWxsPVwibm9uZVwiIGZpbGwtcnVsZT1cImV2ZW5vZGRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCI+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGggY2xhc3M9XCJmaWxsXCIgZmlsbD1cImN1cnJlbnRDb2xvclwiIGQ9XCJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nPlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc3BhbiwgZGl2KVxyXG4gICAgfVxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRLZXllZEFycmF5KG9iail7XHJcbiAgICBsZXQgYXJyID0gW11cclxuICAgIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChrID0+IHtcclxuICAgICAgICBhcnIucHVzaChbaywgb2JqW2tdXSlcclxuICAgIH0pXHJcbiAgICByZXR1cm4gYXJyXHJcbn1cclxuXHJcbmxldCBrZXkgPSBudWxsXHJcbmxldCBzYXZlID0gbnVsbFxyXG5cclxud2luZG93LkxpZ2h0Y29yZC5BcGkuZW5zdXJlRXhwb3J0ZWQobT0+bS5PYmplY3RTdG9yYWdlKVxyXG4udGhlbihsb2NhbFN0b3JhZ2VNb2R1bGUgPT4ge1xyXG4gICAgbGV0IGxvY2FsU3RvcmFnZSA9IGxvY2FsU3RvcmFnZU1vZHVsZS5pbXBsXHJcbiAgICBzYXZlID0gZnVuY3Rpb24oKXtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0KFwiUGx1Z2luQ2VydGlmaWVyS2V5RW5jcnlwdGlvbl9fXCIsIGJ0b2EoSlNPTi5zdHJpbmdpZnkoa2V5KSkpXHJcbiAgICB9XHJcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XHJcbiAgICAgICAgc2F2ZSgpXHJcbiAgICB9LCAxMDAwMDApO1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCB2YWwgPSBzYWZlSlNPTlBhcnNlKGF0b2IobG9jYWxTdG9yYWdlLmdldChcIlBsdWdpbkNlcnRpZmllcktleUVuY3J5cHRpb25fX1wiKSkpXHJcbiAgICAgICAgaWYodmFsIGluc3RhbmNlb2YgRXJyb3IgfHwgIUFycmF5LmlzQXJyYXkodmFsKSB8fCB2YWwubGVuZ3RoICE9PSAyIHx8IHZhbC5maW5kKGUgPT4gdHlwZW9mIGUgIT09IFwic3RyaW5nXCIpIHx8IEJ1ZmZlci5mcm9tKHZhbFswXSwgXCJiYXNlNjRcIikubGVuZ3RoICE9PSAxNiB8fCBCdWZmZXIuZnJvbSh2YWxbMV0sIFwiYmFzZTY0XCIpLmxlbmd0aCAhPT0gMzIpe1xyXG4gICAgICAgICAgICBnZW5lcmF0ZUtleSgpXHJcbiAgICAgICAgICAgIHNhdmUoKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAga2V5ID0gdmFsXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgZ2VuZXJhdGVLZXkoKVxyXG4gICAgICAgIHNhdmUoKVxyXG4gICAgfVxyXG59KVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVLZXkoKXtcclxuICAgIGtleSA9IFtjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKFwiYmFzZTY0XCIpLCBjcnlwdG8ucmFuZG9tQnl0ZXMoMzIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpXVxyXG59XHJcblxyXG5mdW5jdGlvbiBzYWZlSlNPTlBhcnNlKGpzb24pe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pXHJcbiAgICB9Y2F0Y2goZSl7XHJcbiAgICAgICAgcmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvciA/IG5ldyBFcnJvcihlKSA6IGVcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHRTZXR0aW5nc0NhY2hlKGRhdGEpe1xyXG4gICAgdHJ5e1xyXG4gICAgICAgIGxldCBkZWNpcGhlciA9IGNyeXB0by5jcmVhdGVEZWNpcGhlcml2KFwiYWVzLTI1Ni1jYmNcIiwgQnVmZmVyLmZyb20oa2V5WzFdLCBcImJhc2U2NFwiKSwgQnVmZmVyLmZyb20oa2V5WzBdLCBcImJhc2U2NFwiKSlcclxuICAgICAgICBsZXQgZGVjcnlwdGVkID0gZGVjaXBoZXIudXBkYXRlKEJ1ZmZlci5mcm9tKGRhdGEsIFwiYmFzZTY0XCIpKTtcclxuICAgICAgICBkZWNyeXB0ZWQgPSBCdWZmZXIuY29uY2F0KFtkZWNyeXB0ZWQsIGRlY2lwaGVyLmZpbmFsKCldKTtcclxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKFwidXRmOFwiKVxyXG4gICAgfWNhdGNoKGUpe1xyXG4gICAgICAgIHJldHVybiBcInt9XCJcclxuICAgIH1cclxufVxyXG5leHBvcnQgZnVuY3Rpb24gZW5jcnlwdFNldHRpbmdzQ2FjaGUoZGF0YSl7XHJcbiAgICBsZXQgYXJncyA9IFtCdWZmZXIuZnJvbShrZXlbMV0sIFwiYmFzZTY0XCIpLCBCdWZmZXIuZnJvbShrZXlbMF0sIFwiYmFzZTY0XCIpXVxyXG4gICAgXHJcbiAgICBsZXQgY2lwaGVyID0gY3J5cHRvLmNyZWF0ZUNpcGhlcml2KCdhZXMtMjU2LWNiYycsIC4uLmFyZ3MpO1xyXG4gICAgbGV0IGVuY3J5cHRlZCA9IGNpcGhlci51cGRhdGUoQnVmZmVyLmZyb20oZGF0YSwgXCJ1dGY4XCIpKTtcclxuICAgIGVuY3J5cHRlZCA9IEJ1ZmZlci5jb25jYXQoW2VuY3J5cHRlZCwgY2lwaGVyLmZpbmFsKCldKTtcclxuICAgIHJldHVybiBlbmNyeXB0ZWQudG9TdHJpbmcoXCJiYXNlNjRcIilcclxufSIsImltcG9ydCB7YmRwbHVnaW5FcnJvcnMsIHBsdWdpbkNvb2tpZSwgc2V0dGluZ3NDb29raWUsIGJkcGx1Z2luc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XG5pbXBvcnQgQ29udGVudE1hbmFnZXIgZnJvbSBcIi4vY29udGVudE1hbmFnZXJcIjtcbmltcG9ydCBEYXRhU3RvcmUgZnJvbSBcIi4vZGF0YVN0b3JlXCI7XG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xuXG5jbGFzcyBQbHVnaW5Nb2R1bGUge1xuICAgIGNvbnN0cnVjdG9yKCl7XG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5QbHVnaW5Nb2R1bGUgPSB0aGlzXG4gICAgfVxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXI7fVxufVxuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5zID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIHRoaXMubG9hZFBsdWdpbkRhdGEoKTtcbiAgICBiZHBsdWdpbkVycm9ycy5zcGxpY2UoMCwgMCwgLi4uKGF3YWl0IENvbnRlbnRNYW5hZ2VyLmxvYWRQbHVnaW5zKCkpKTtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHBsdWdpbiwgbmFtZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4uZ2V0TmFtZSgpO1xuICAgICAgICAgICAgaWYgKHBsdWdpbi5sb2FkICYmIHR5cGVvZihwbHVnaW4ubG9hZCkgPT0gXCJmdW5jdGlvblwiKSBwbHVnaW4ubG9hZCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBuYW1lICsgXCIgY291bGQgbm90IGJlIGxvYWRlZC5cIiwgZXJyKTtcbiAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJsb2FkKCkgY291bGQgbm90IGJlIGZpcmVkLlwiLCBlcnJvcjoge21lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrfX0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtuYW1lXSkgcGx1Z2luQ29va2llW25hbWVdID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHBsdWdpbkNvb2tpZVtuYW1lXSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBwbHVnaW4uc3RhcnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RhcnRlZC5gKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHBsdWdpbkNvb2tpZVtuYW1lXSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIFV0aWxzLmVycihcIlBsdWdpbnNcIiwgbmFtZSArIFwiIGNvdWxkIG5vdCBiZSBzdGFydGVkLlwiLCBlcnIpO1xuICAgICAgICAgICAgICAgIGJkcGx1Z2luRXJyb3JzLnB1c2goe25hbWU6IG5hbWUsIGZpbGU6IGJkcGx1Z2luc1twbHVnaW5zW2ldXS5maWxlbmFtZSwgbWVzc2FnZTogXCJzdGFydCgpIGNvdWxkIG5vdCBiZSBmaXJlZC5cIiwgZXJyb3I6IHttZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFja319KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwKSlcbiAgICB9XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuXG4gICAgcmVxdWlyZShcImVsZWN0cm9uXCIpLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS5vbihcImRpZC1uYXZpZ2F0ZS1pbi1wYWdlXCIsIHRoaXMuY2hhbm5lbFN3aXRjaC5iaW5kKHRoaXMpKTtcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuc3RhcnRQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0YXJ0KCk7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldE5hbWUoKX0gdiR7YmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmdldFZlcnNpb24oKX0gaGFzIHN0YXJ0ZWQuYCk7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBjb3VsZCBub3QgYmUgc3RhcnRlZC5gLCB7dHlwZTogXCJlcnJvclwifSk7XG4gICAgICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2F2ZVBsdWdpbkRhdGEoKTtcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBwbHVnaW4gKyBcIiBjb3VsZCBub3QgYmUgc3RhcnRlZC5cIiwgZXJyKTtcbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnN0b3BQbHVnaW4gPSBmdW5jdGlvbihwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLnN0b3AoKTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpfSB2JHtiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0VmVyc2lvbigpfSBoYXMgc3RvcHBlZC5gKTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0gJiYgIXJlbG9hZCkgVXRpbHMuc2hvd1RvYXN0KGAke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXROYW1lKCl9IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IGNvdWxkIG5vdCBiZSBzdG9wcGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcbiAgICAgICAgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBiZHBsdWdpbnNbcGx1Z2luXS5wbHVnaW4uZ2V0TmFtZSgpICsgXCIgY291bGQgbm90IGJlIHN0b3BwZWQuXCIsIGVycik7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lbmFibGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gdHJ1ZTtcbiAgICB0aGlzLnNhdmVQbHVnaW5EYXRhKCk7XG4gICAgdGhpcy5zdGFydFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZVBsdWdpbiA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luXSkgcmV0dXJuO1xuICAgIHBsdWdpbkNvb2tpZVtwbHVnaW5dID0gZmFsc2U7XG4gICAgdGhpcy5zYXZlUGx1Z2luRGF0YSgpO1xuICAgIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHJlbG9hZCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmRpc2FibGUgPSBmdW5jdGlvbiAocGx1Z2luLCByZWxvYWQgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luLCByZWxvYWQpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS50b2dnbGVQbHVnaW4gPSBmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgaWYgKHBsdWdpbkNvb2tpZVtwbHVnaW5dKSB0aGlzLmRpc2FibGVQbHVnaW4ocGx1Z2luKTtcbiAgICBlbHNlIHRoaXMuZW5hYmxlUGx1Z2luKHBsdWdpbik7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnRvZ2dsZSA9IGZ1bmN0aW9uIChwbHVnaW4sIHJlbG9hZCA9IGZhbHNlKSB7XG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlUGx1Z2luKHBsdWdpbiwgcmVsb2FkKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUubG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5sb2FkQ29udGVudChmaWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBjb25zdCBwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IChjb25zb2xlLmxvZyhwLmZpbGVuYW1lLCBmaWxlbmFtZSkpIHx8IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWUpLnBsdWdpbjtcbiAgICB0cnkgeyBpZiAocGx1Z2luLmxvYWQgJiYgdHlwZW9mKHBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIHBsdWdpbi5sb2FkKCk7fVxuICAgIGNhdGNoIChlcnIpIHtpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHtwbHVnaW5zOiBbZXJyXX0pO31cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW4uZ2V0TmFtZSgpfSB2JHtwbHVnaW4uZ2V0VmVyc2lvbigpfSB3YXMgbG9hZGVkLmApO1xuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3BsdWdpbi5nZXROYW1lKCl9IHYke3BsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyBsb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJwbHVnaW4tbG9hZGVkXCIsIHBsdWdpbi5nZXROYW1lKCkpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS51bmxvYWRQbHVnaW4gPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbi5wbHVnaW4uZ2V0TmFtZSgpO1xuICAgIGlmIChwbHVnaW5Db29raWVbcGx1Z2luXSkgdGhpcy5kaXNhYmxlUGx1Z2luKHBsdWdpbiwgdHJ1ZSk7XG4gICAgY29uc3QgZXJyb3IgPSBDb250ZW50TWFuYWdlci51bmxvYWRDb250ZW50KGJkcGx1Z2luc1twbHVnaW5dLmZpbGVuYW1lLCBcInBsdWdpblwiKTtcbiAgICBkZWxldGUgYmRwbHVnaW5zW3BsdWdpbl07XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHdhcyB1bmxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi11bmxvYWRlZFwiLCBwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xuICAgIGNvbnN0IGJkcGx1Z2luID0gT2JqZWN0LnZhbHVlcyhiZHBsdWdpbnMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHBsdWdpbnNbZmlsZW5hbWVPck5hbWVdO1xuICAgIGlmICghYmRwbHVnaW4pIHJldHVybjtcbiAgICB0aGlzLnVubG9hZFBsdWdpbihiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc3QgZnVsbFBhdGggPSByZXF1aXJlKFwicGF0aFwiKS5yZXNvbHZlKENvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIsIGJkcGx1Z2luLmZpbGVuYW1lKTtcbiAgICByZXF1aXJlKFwiZnNcIikudW5saW5rU3luYyhmdWxsUGF0aCk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJlbG9hZFBsdWdpbiA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW4ucGx1Z2luLmdldE5hbWUoKTtcbiAgICBjb25zdCBlbmFibGVkID0gcGx1Z2luQ29va2llW3BsdWdpbl07XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RvcFBsdWdpbihwbHVnaW4sIHRydWUpO1xuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIucmVsb2FkQ29udGVudChiZHBsdWdpbnNbcGx1Z2luXS5maWxlbmFtZSwgXCJwbHVnaW5cIik7XG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMVwiXSkgVXRpbHMuc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IFtlcnJvcl19KTtcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwge3R5cGU6IFwiZXJyb3JcIn0pO1xuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7cGx1Z2lufSBjb3VsZCBub3QgYmUgcmVsb2FkZWQuYCwgZXJyb3IpO1xuICAgIH1cbiAgICBpZiAoYmRwbHVnaW5zW3BsdWdpbl0ucGx1Z2luLmxvYWQgJiYgdHlwZW9mKGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKSA9PSBcImZ1bmN0aW9uXCIpIGJkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5sb2FkKCk7XG4gICAgaWYgKGVuYWJsZWQpIHRoaXMuc3RhcnRQbHVnaW4ocGx1Z2luLCB0cnVlKTtcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gKTtcbiAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtwbHVnaW59IHYke2JkcGx1Z2luc1twbHVnaW5dLnBsdWdpbi5nZXRWZXJzaW9uKCl9IHdhcyByZWxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInBsdWdpbi1yZWxvYWRlZFwiLCBwbHVnaW4pO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5yZWxvYWQgPSBmdW5jdGlvbihuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMucmVsb2FkUGx1Z2luKG5hbWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5lZGl0ID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcbiAgICBjb25zb2xlLmxvZyhcIkVkaXQgXCIgKyBmaWxlbmFtZU9yTmFtZSk7XG4gICAgY29uc3QgYmRwbHVnaW4gPSBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkcGx1Z2luc1tmaWxlbmFtZU9yTmFtZV07XG4gICAgaWYgKCFiZHBsdWdpbikgcmV0dXJuO1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcmVxdWlyZShcInBhdGhcIikucmVzb2x2ZShDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XG4gICAgY29uc29sZS5sb2coXCJFZGl0IFwiICsgZnVsbFBhdGgpO1xuICAgIHJlcXVpcmUoXCJlbGVjdHJvblwiKS5zaGVsbC5vcGVuSXRlbShgJHtmdWxsUGF0aH1gKTtcbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUudXBkYXRlUGx1Z2luTGlzdCA9IGZ1bmN0aW9uKCkge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBDb250ZW50TWFuYWdlci5sb2FkTmV3Q29udGVudChcInBsdWdpblwiKTtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHJlc3VsdHMuYWRkZWQpIHRoaXMubG9hZFBsdWdpbihmaWxlbmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRQbHVnaW4obmFtZSk7XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLmxvYWRQbHVnaW5EYXRhID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHNhdmVkID0gRGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInBsdWdpbnNcIik7XG4gICAgaWYgKHNhdmVkKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGx1Z2luQ29va2llLCBzYXZlZCk7XG4gICAgfVxufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5zYXZlUGx1Z2luRGF0YSA9IGZ1bmN0aW9uICgpIHtcbiAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwicGx1Z2luc1wiLCBwbHVnaW5Db29raWUpO1xufTtcblxuUGx1Z2luTW9kdWxlLnByb3RvdHlwZS5uZXdNZXNzYWdlID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9uTWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25NZXNzYWdlKCk7IH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsgVXRpbHMuZXJyKFwiUGx1Z2luc1wiLCBcIlVuYWJsZSB0byBmaXJlIG9uTWVzc2FnZSBmb3IgXCIgKyBwbHVnaW4uZ2V0TmFtZSgpICsgXCIuXCIsIGVycik7IH1cbiAgICAgICAgfVxuICAgIH1cbn07XG5cblBsdWdpbk1vZHVsZS5wcm90b3R5cGUuY2hhbm5lbFN3aXRjaCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBwbHVnaW5zID0gT2JqZWN0LmtleXMoYmRwbHVnaW5zKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYmRwbHVnaW5zW3BsdWdpbnNbaV1dLnBsdWdpbjtcbiAgICAgICAgaWYgKCFwbHVnaW5Db29raWVbcGx1Z2luLmdldE5hbWUoKV0pIGNvbnRpbnVlO1xuICAgICAgICBpZiAodHlwZW9mIHBsdWdpbi5vblN3aXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICB0cnkgeyBwbHVnaW4ub25Td2l0Y2goKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb25Td2l0Y2ggZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5QbHVnaW5Nb2R1bGUucHJvdG90eXBlLnJhd09ic2VydmVyID0gZnVuY3Rpb24oZSkge1xuICAgIGNvbnN0IHBsdWdpbnMgPSBPYmplY3Qua2V5cyhiZHBsdWdpbnMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGx1Z2lucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBwbHVnaW4gPSBiZHBsdWdpbnNbcGx1Z2luc1tpXV0ucGx1Z2luO1xuICAgICAgICBpZiAoIXBsdWdpbkNvb2tpZVtwbHVnaW4uZ2V0TmFtZSgpXSkgY29udGludWU7XG4gICAgICAgIGlmICh0eXBlb2YgcGx1Z2luLm9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHRyeSB7IHBsdWdpbi5vYnNlcnZlcihlKTsgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGZpcmUgb2JzZXJ2ZXIgZm9yIFwiICsgcGx1Z2luLmdldE5hbWUoKSArIFwiLlwiLCBlcnIpOyB9XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBuZXcgUGx1Z2luTW9kdWxlKCk7IiwiaW1wb3J0IHsgdGhlbWVDb29raWUgfSBmcm9tIFwiLi4vMGdsb2JhbHNcIlxyXG5pbXBvcnQgYmRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIlxyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCJcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBwb3BvdXRXaW5kb3cge1xyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBAdHlwZSB7TWFwPHN0cmluZywgV2luZG93Pn1cclxuICAgICAgICAgKi9cclxuICAgICAgICB0aGlzLndpbmRvd3MgPSBuZXcgTWFwKClcclxuICAgICAgICB0aGlzLmVuYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgIHRoaXMuaW5pdCgpXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpe1xyXG4gICAgICAgIGxldCBwb3BvdXRNb2R1bGUgPSBhd2FpdCB3aW5kb3cuTGlnaHRjb3JkLkFwaS5lbnN1cmVFeHBvcnRlZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0V2luZG93KVxyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlci5zdWJzY3JpYmUoXCJQT1BPVVRfV0lORE9XX09QRU5cIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAvKipcclxuICAgICAgICAgICAgICAgICAqIEB0eXBlIHtXaW5kb3d9XHJcbiAgICAgICAgICAgICAgICAgKi9cclxuICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHBvcG91dE1vZHVsZS5kZWZhdWx0LmdldFdpbmRvdyhldi5rZXkpXHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvd3Muc2V0KGV2LmtleSwgd2luZG93KVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjbGFzc0xpc3QgPSB3aW5kb3cuZG9jdW1lbnQuYm9keS5jbGFzc0xpc3RcclxuICAgICAgICAgICAgICAgIGNsYXNzTGlzdC5hZGQoXCJ3aW5kb3ctcG9wb3V0XCIpXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXHJcbiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKFwibGlnaHRjb3JkXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGUoZXYua2V5KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyLnN1YnNjcmliZShcIlBPUE9VVF9XSU5ET1dfQ0xPU0VcIiwgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIHNldEltbWVkaWF0ZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLndpbmRvd3MuZGVsZXRlKGV2LmtleSlcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtZW5hYmxlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtZGlzYWJsZWRcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICAgICAgfSlcclxuICAgICAgICBiZEV2ZW50cy5vbihcInRoZW1lLXJlbG9hZGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgYmRFdmVudHMub24oXCJ0aGVtZS11bmxvYWRlZFwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgICAgICB9KVxyXG4gICAgICAgIGJkRXZlbnRzLm9uKFwidGhlbWUtbG9hZGVkXCIsICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZW5hYmxlKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZVxyXG4gICAgICAgIHRoaXMudXBkYXRlKClcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlKCl7XHJcbiAgICAgICAgdGhpcy5lbmFibGVkID0gZmFsc2VcclxuICAgICAgICB0aGlzLnVwZGF0ZSgpXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlKGtleSl7XHJcbiAgICAgICAgaWYoIXRoaXMud2luZG93cy5zaXplKXJldHVyblxyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpe1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVUaGVtZXMoa2V5KVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBseVRoZW1lcyhrZXkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZVRoZW1lcyhrZXkpe1xyXG4gICAgICAgIGlmKHRoaXMuZW5hYmxlZClyZXR1cm5cclxuICAgICAgICBpZihrZXkpe1xyXG4gICAgICAgICAgICBsZXQgd2luZG93ID0gdGhpcy53aW5kb3dzLmdldChrZXkpXHJcbiAgICAgICAgICAgIGlmKCF3aW5kb3cpcmV0dXJuXHJcbiAgICAgICAgICAgIGxldCBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudFxyXG5cclxuICAgICAgICAgICAgZm9yKGxldCBzdHlsZSBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwic3R5bGVbZGF0YS1saWdodGNvcmQtdGhlbWU9dHJ1ZV1cIikpe1xyXG4gICAgICAgICAgICAgICAgc3R5bGUucmVtb3ZlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBmb3IobGV0IGtleSBvZiB0aGlzLndpbmRvd3Mua2V5cygpKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlVGhlbWVzKGtleSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhcHBseVRoZW1lcyhrZXkpe1xyXG4gICAgICAgIGlmKCF0aGlzLmVuYWJsZWQpcmV0dXJuXHJcbiAgICAgICAgaWYoa2V5KXtcclxuICAgICAgICAgICAgbGV0IHdpbmRvdyA9IHRoaXMud2luZG93cy5nZXQoa2V5KVxyXG4gICAgICAgICAgICBpZighd2luZG93KXJldHVyblxyXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnRcclxuXHJcbiAgICAgICAgICAgIGZvcihsZXQgc3R5bGUgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInN0eWxlW2RhdGEtbGlnaHRjb3JkLXRoZW1lPXRydWVdXCIpKXtcclxuICAgICAgICAgICAgICAgIHN0eWxlLnNldEF0dHJpYnV0ZShcIndpbGwtcmVtb3ZlXCIsIFwidHJ1ZVwiKVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhiZHRoZW1lcylcclxuICAgICAgICAgICAgLmZvckVhY2godGhlbWVOYW1lID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCF0aGVtZUNvb2tpZVt0aGVtZU5hbWVdKXJldHVybiAvLyB0aGVtZSBkaXNhYmxlZFxyXG4gICAgICAgICAgICAgICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1t0aGVtZU5hbWVdXHJcbiAgICAgICAgICAgICAgICBpZighdGhlbWUpcmV0dXJuIC8vOnNocnVnOlxyXG5cclxuICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdHlsZVtkYXRhLWxpZ2h0Y29yZC10aGVtZT10cnVlXSNcIitET00uZXNjYXBlSUQodGhlbWUuaWQpKVxyXG4gICAgICAgICAgICAgICAgaWYoZXhpc3Rpbmcpe1xyXG4gICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLmlubmVySFRNTCA9IHVuZXNjYXBlKHRoZW1lLmNzcylcclxuICAgICAgICAgICAgICAgICAgICBleGlzdGluZy5yZW1vdmVBdHRyaWJ1dGUoXCJ3aWxsLXJlbW92ZVwiKVxyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIilcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pZCA9IERPTS5lc2NhcGVJRCh0aGVtZS5pZClcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5pbm5lckhUTUwgPSB1bmVzY2FwZSh0aGVtZS5jc3MpXHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKFwiZGF0YS1saWdodGNvcmQtdGhlbWVcIiwgXCJ0cnVlXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoc3R5bGUpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgICAgICBmb3IobGV0IHN0eWxlIG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJzdHlsZVt3aWxsLXJlbW92ZT10cnVlXVwiKSl7XHJcbiAgICAgICAgICAgICAgICBzdHlsZS5yZW1vdmUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGZvcihsZXQga2V5IG9mIHRoaXMud2luZG93cy5rZXlzKCkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hcHBseVRoZW1lcyhrZXkpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IHdlYnBhY2tNb2R1bGVzIGZyb20gXCIuL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgVjJDX1B1YmxpY1NlcnZlcnMgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvcHVibGljU2VydmVyc1wiO1xyXG5pbXBvcnQgTGF5ZXIgZnJvbSBcIi4uL3VpL3B1YmxpY3NlcnZlcnMvbGF5ZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IG5ldyBjbGFzcyBWMl9QdWJsaWNTZXJ2ZXJzIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLl9hcHBlbmRCdXR0b24gPSB0aGlzLl9hcHBlbmRCdXR0b24uYmluZCh0aGlzKTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjJfUHVibGljU2VydmVycyA9IHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTGF5ZXIsIHtyb290SWQ6IFwicHVic2xheWVycm9vdFwiLCBpZDogXCJwdWJzbGF5ZXJcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfUHVibGljU2VydmVycywge3Jvb3RJZDogXCJwdWJzbGF5ZXJyb290XCJ9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInB1YnNsYXllcnJvb3RcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIF9yb290O1xyXG4gICAgfVxyXG5cclxuICAgIGluamVjdFJvb3QoKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1lTGF5ZXJzXHJcbiAgICAgICAgXSA9IFtcclxuICAgICAgICAgICAgVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUubGF5ZXJzICYmIGUubGF5ZXIpWzBdLmxheWVycylcclxuICAgICAgICBdXHJcbiAgICAgICAgY29uc3QgbGF5ZXJzID0gRE9NLnF1ZXJ5KFwiLmxheWVycywgLlwiK2NsYXNzTmFtZUxheWVycyk7XHJcbiAgICAgICAgaWYgKCFsYXllcnMpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBsYXllcnMuYXBwZW5kKERPTS5jcmVhdGVFbGVtZW50KFwiPGRpdiBpZD0ncHVic2xheWVycm9vdCc+XCIpKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgcm9vdCA9IHRoaXMucm9vdDtcclxuICAgICAgICBpZiAoIXJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gTE9DQVRFIFJPT1Q6IC5sYXllcnNcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIodGhpcy5jb21wb25lbnQsIHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBidXR0b24oKSB7XHJcbiAgICAgICAgY29uc3QgYnRuID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItbGlcIiBjbGFzcz1cIiR7QkRWMi5ndWlsZENsYXNzZXMubGlzdEl0ZW19XCI+YCk7XHJcbiAgICAgICAgaWYgKCFzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy0xXCJdKSBidG4uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1wdWItYnV0dG9uXCIgY2xhc3M9XCIke1wid3JhcHBlci0yNWVWSW4gXCIgKyBCRFYyLmd1aWxkQ2xhc3Nlcy5jaXJjbGVCdXR0b25NYXNrfVwiPnB1YmxpYzwvZGl2PmApO1xyXG4gICAgICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7dGhpcy5yZW5kZXIoKTt9KTtcclxuICAgICAgICBidG4uYXBwZW5kKGxhYmVsKTtcclxuICAgICAgICByZXR1cm4gYnRuO1xyXG4gICAgfVxyXG5cclxuICAgIF9hcHBlbmRCdXR0b24oKSB7XHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgY2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXJcclxuICAgICAgICBdID0gW1xyXG4gICAgICAgICAgICBVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kb3dubG9hZFByb2dyZXNzICYmIGUudHV0b3JpYWxDb250YWluZXIpWzBdLnR1dG9yaWFsQ29udGFpbmVyKVxyXG4gICAgICAgIF1cclxuICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKSkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IERPTS5xdWVyeShgZGl2LiR7Y2xhc3NOYW1ldHV0b3JpYWxDb250YWluZXJ9ID4gZGl2YCk7XHJcbiAgICAgICAgRE9NLmFmdGVyKGd1aWxkcywgdGhpcy5idXR0b24pO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZEJ1dHRvbigpIHtcclxuICAgICAgICBpZiAodGhpcy5ndWlsZFBhdGNoKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0ID0gd2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdCAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJOYXZpZ2FibGVHdWlsZHNcIik7XHJcbiAgICAgICAgY29uc3QgR3VpbGRMaXN0T2xkID0gd2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJHdWlsZHNcIik7XHJcbiAgICAgICAgaWYgKCFHdWlsZExpc3QgJiYgIUd1aWxkTGlzdE9sZCkgVXRpbHMud2FybihcIlB1YmxpY1NlcnZlclwiLCBcIkNhbid0IGZpbmQgR3VpbGRMaXN0IGNvbXBvbmVudFwiKTtcclxuICAgICAgICB0aGlzLmd1aWxkUGF0Y2ggPSBVdGlscy5tb25rZXlQYXRjaChHdWlsZExpc3QgPyBHdWlsZExpc3QgOiBHdWlsZExpc3RPbGQucHJvdG90eXBlLCBHdWlsZExpc3QgPyBcImRlZmF1bHRcIiA6IFwicmVuZGVyXCIsIHthZnRlcjogdGhpcy5fYXBwZW5kQnV0dG9ufSk7XHJcbiAgICAgICAgdGhpcy5fYXBwZW5kQnV0dG9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlQnV0dG9uKCkge1xyXG4gICAgICAgIHRoaXMuZ3VpbGRQYXRjaCgpO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLmd1aWxkUGF0Y2g7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uID0gRE9NLnF1ZXJ5KFwiI2JkLXB1Yi1saVwiKTtcclxuICAgICAgICBpZiAoYnV0dG9uKSBidXR0b24ucmVtb3ZlKCk7XHJcbiAgICB9XHJcbn07IiwiaW1wb3J0IHtzZXR0aW5ncywgc2V0dGluZ3NDb29raWUsIHNldHRpbmdzUlBDfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciBmcm9tIFwiLi9zZXR0aW5nc1BhbmVsU2lkZWJhclwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4vdXRpbHNcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcclxuaW1wb3J0IENvbnRlbnRNYW5hZ2VyIGZyb20gXCIuL2NvbnRlbnRNYW5hZ2VyXCI7XHJcbmltcG9ydCBjb2xvcmVkVGV4dCBmcm9tIFwiLi9jb2xvcmVkVGV4dFwiO1xyXG5pbXBvcnQgdGZIb3VyIGZyb20gXCIuLzI0aG91clwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgcHVibGljU2VydmVyc01vZHVsZSBmcm9tIFwiLi9wdWJsaWNTZXJ2ZXJzXCI7XHJcbmltcG9ydCB2b2ljZU1vZGUgZnJvbSBcIi4vdm9pY2VNb2RlXCI7XHJcbmltcG9ydCBDbGFzc05vcm1hbGl6ZXIgZnJvbSBcIi4vY2xhc3NOb3JtYWxpemVyXCI7XHJcbmltcG9ydCBkTW9kZSBmcm9tIFwiLi9kZXZNb2RlXCI7XHJcblxyXG5pbXBvcnQgU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBmcm9tIFwiLi4vdWkvc2VjdGlvbmVkU2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQ3NzRWRpdG9yIGZyb20gXCIuLi91aS9jc3NFZGl0b3JcIjtcclxuaW1wb3J0IENhcmRMaXN0IGZyb20gXCIuLi91aS9hZGRvbmxpc3RcIjtcclxuaW1wb3J0IFYyQ19QcmVzZW5jZVNldHRpbmdzIGZyb20gXCIuLi91aS9wcmVzZW5jZVNldHRpbmdzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4vQ3VzdG9tUmljaFByZXNlbmNlXCI7XHJcbmltcG9ydCBWMkNfQWNjb3VudEluZm9zIGZyb20gXCIuLi91aS9BY2NvdW50SW5mb3NcIjtcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBBbnRpQWRETSBmcm9tIFwiLi9BbnRpQWRETVwiO1xyXG5pbXBvcnQgYmx1clByaXZhdGUgZnJvbSBcIi4vYmx1clByaXZhdGVcIjtcclxuaW1wb3J0IGRpc2FibGVUeXBpbmcgZnJvbSBcIi4vZGlzYWJsZVR5cGluZ1wiO1xyXG5pbXBvcnQgQXBpUHJldmlldyBmcm9tIFwiLi4vdWkvQXBpUHJldmlld1wiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuLi91aS9zd2l0Y2hcIjtcclxuaW1wb3J0IE1hcmdpblRvcCBmcm9tIFwiLi4vdWkvbWFyZ2ludG9wXCI7XHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xyXG5pbXBvcnQgdG9vbHRpcFdyYXAgZnJvbSBcIi4uL3VpL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi91aS9pY29ucy9oaXN0b3J5XCI7XHJcbmltcG9ydCBjb3JlIGZyb20gXCIuL2NvcmVcIjtcclxuaW1wb3J0IHBvcG91dFdpbmRvdyBmcm9tIFwiLi9wb3BvdXRXaW5kb3dcIjtcclxuXHJcbmNsYXNzIEJEU2lkZWJhckhlYWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNpZGViYXJDb21wb25lbnRzID0gd2VicGFja01vZHVsZXMuZmluZChlID0+IGUuU2VwYXJhdG9yICYmIGUuSGVhZGVyICYmIGUuSXRlbSlcclxuXHJcbiAgICAgICAgY29uc3QgY2hhbmdlbG9nQnV0dG9uID0gUmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge2NvbG9yOiBcImJsYWNrXCIsIHNpZGU6IFwidG9wXCIsIHRleHQ6IFwiQ2hhbmdlbG9nXCJ9LCBcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge3N0eWxlOiB7ZmxvYXQ6IFwicmlnaHRcIiwgY3Vyc29yOiBcInBvaW50ZXJcIn0sIGNsYXNzTmFtZTogXCJiZC1jaGFuZ2Vsb2ctYnV0dG9uXCIsIG9uQ2xpY2s6ICgpID0+IHtVdGlscy5zaG93Q2hhbmdlbG9nTW9kYWwoYmJkQ2hhbmdlbG9nKTt9fSxcclxuICAgICAgICAgICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoSGlzdG9yeSwge2NsYXNzTmFtZTogXCJiZC1pY29uXCIsIHNpemU6IFwiMTZweFwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlbmRlcmVkID0gbmV3IHNpZGViYXJDb21wb25lbnRzLkhlYWRlcih7XHJcbiAgICAgICAgICAgIGNoaWxkcmVuOiBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsLCBcIkJhbmRhZ2VkIEJEXCIsIGNoYW5nZWxvZ0J1dHRvbiksXHJcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwiXHJcbiAgICAgICAgfSlcclxuICAgICAgICByZXR1cm4gcmVuZGVyZWRcclxuICAgIH1cclxufVxyXG5cclxubGV0IGlzQ2xlYXJpbmdDYWNoZSA9IGZhbHNlXHJcblxyXG5leHBvcnQgZGVmYXVsdCBuZXcgY2xhc3MgVjJfU2V0dGluZ3NQYW5lbCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzID0gdGhpcy51cGRhdGVTZXR0aW5ncy5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2lkZWJhciA9IG5ldyBWMl9TZXR0aW5nc1BhbmVsX1NpZGViYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWdpc3RlckNvbXBvbmVudHMoKVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyQ29tcG9uZW50cygpe1xyXG4gICAgICAgIC8qKiBMaWdodGNvcmQgKi9cclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJsaWdodGNvcmRcIiwgbWFrZUNvbXBvbmVudCh0aGlzLmxpZ2h0Y29yZENvbXBvbmVudC5iaW5kKHRoaXMpKSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJzdGF0dXNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLlByZXNlbmNlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImFjY291bnRpbmZvXCIsIG1ha2VDb21wb25lbnQodGhpcy5BY2NvdW50SW5mb3NDb21wb25lbnQuYmluZCh0aGlzKSkpXHJcbiAgICAgICAgdGhpcy5zaWRlYmFyLnJlZ2lzdGVyKFwibGNhcGlwcmV2aWV3XCIsIG1ha2VDb21wb25lbnQodGhpcy5BcGlQcmV2aWV3Q29tcG9uZW50LmJpbmQodGhpcykpKVxyXG5cclxuICAgICAgICAvKiBCYW5kYWdlZCBCRCAqL1xyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcIkJEQ2hhbmdlbG9nVGl0bGVcIiwgbWFrZUNvbXBvbmVudCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgQkRTaWRlYmFySGVhZGVyKCkucmVuZGVyKClcclxuICAgICAgICB9KSlcclxuICAgICAgICB0aGlzLnNpZGViYXIucmVnaXN0ZXIoXCJjb3JlXCIsIG1ha2VDb21wb25lbnQodGhpcy5jb3JlQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcImN1c3RvbWNzc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMuY3VzdG9tQ3NzQ29tcG9uZW50LmJpbmQodGhpcykpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInBsdWdpbnNcIiwgbWFrZUNvbXBvbmVudCh0aGlzLnJlbmRlckFkZG9uUGFuZShcInBsdWdpbnNcIikpKVxyXG4gICAgICAgIHRoaXMuc2lkZWJhci5yZWdpc3RlcihcInRoZW1lc1wiLCBtYWtlQ29tcG9uZW50KHRoaXMucmVuZGVyQWRkb25QYW5lKFwidGhlbWVzXCIpKSlcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0IGNvcmVTZXR0aW5ncygpIHtcclxuICAgICAgICBjb25zdCBzZXR0aW5ncyA9IHRoaXMuZ2V0U2V0dGluZ3MoXCJjb3JlXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbGlnaHRjb3JkU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSB0aGlzLmdldFNldHRpbmdzKFwibGlnaHRjb3JkXCIpO1xyXG4gICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbLi4ubmV3IFNldChzZXR0aW5ncy5tYXAocyA9PiBzLmNhdGVnb3J5KSldO1xyXG4gICAgICAgIGNvbnN0IHNlY3Rpb25zID0gY2F0ZWdvcmllcy5tYXAoYyA9PiB7cmV0dXJuIHt0aXRsZTogYywgc2V0dGluZ3M6IHNldHRpbmdzLmZpbHRlcihzID0+IHMuY2F0ZWdvcnkgPT0gYyl9O30pO1xyXG4gICAgICAgIHJldHVybiBzZWN0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgUHJlc2VuY2VTZXR0aW5ncygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRTZXR0aW5ncyhcInN0YXR1c1wiKVxyXG4gICAgfVxyXG5cclxuICAgIGdldFNldHRpbmdzKGNhdGVnb3J5KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdGVnb3J5ICYmIHNldHRpbmcuaW1wbGVtZW50ZWQgJiYgIXNldHRpbmcuaGlkZGVuKSB7XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nLnRleHQgPSBrZXk7XHJcbiAgICAgICAgICAgICAgICBhcnIucHVzaChzZXR0aW5nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYXJyO1xyXG4gICAgICAgIH0sIFtdKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQsIHNpZGViYXIpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKGlkLCBjaGVja2VkLCBzaWRlYmFyKTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVTZXR0aW5ncyhpZCwgZW5hYmxlZCwgc2lkZWJhcikge1xyXG4gICAgICAgIGlmKCFbXCJsaWdodGNvcmQtOFwiLCBcIm5vX3dpbmRvd19ib3VuZFwiLCBcImVuYWJsZV9nbGFzc3Ryb25cIiwgXCJsaWdodGNvcmQtMTBcIl0uaW5jbHVkZXMoaWQpKXNldHRpbmdzQ29va2llW2lkXSA9IGVuYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0yXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKGRvY3VtZW50LmJvZHksIFwiYmQtbWluaW1hbFwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImJkYS1ncy0zXCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICAgICAgZWxzZSBET00ucmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgXCJiZC1taW5pbWFsLWNoYW5cIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBwdWJsaWNTZXJ2ZXJzTW9kdWxlLmFkZEJ1dHRvbigpO1xyXG4gICAgICAgICAgICBlbHNlIHB1YmxpY1NlcnZlcnNNb2R1bGUucmVtb3ZlQnV0dG9uKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJiZGEtZ3MtNFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB2b2ljZU1vZGUuc3RhcnQoKTtcclxuICAgICAgICAgICAgZWxzZSB2b2ljZU1vZGUuc3RvcCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgRE9NLmFkZENsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgICAgIGVsc2UgRE9NLnJlbW92ZUNsYXNzKERPTS5xdWVyeShcIiNhcHAtbW91bnRcIiksIFwiYmRhLWRhcmtcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoZW5hYmxlZCAmJiBpZCA9PSBcImJkYS1ncy02XCIpIHRmSG91ci5pbmplY3QyNEhvdXIoKTtcclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLTdcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgY29sb3JlZFRleHQuaW5qZWN0Q29sb3JlZFRleHQoKTtcclxuICAgICAgICAgICAgZWxzZSBjb2xvcmVkVGV4dC5yZW1vdmVDb2xvcmVkVGV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiZm9yay1wcy00XCIpIHtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIENsYXNzTm9ybWFsaXplci5zdGFydCgpO1xyXG4gICAgICAgICAgICBlbHNlIENsYXNzTm9ybWFsaXplci5zdG9wKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoaWQgPT0gXCJmb3JrLXBzLTVcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwicGx1Z2luXCIpO1xyXG4gICAgICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBDb250ZW50TWFuYWdlci51bndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLnVud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstd3AtMVwiKSB7XHJcbiAgICAgICAgICAgIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJ0cmFuc3BhcmVudFwiLCBlbmFibGVkKTtcclxuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIFV0aWxzLnNldFdpbmRvd1ByZWZlcmVuY2UoXCJiYWNrZ3JvdW5kQ29sb3JcIiwgbnVsbCk7XHJcbiAgICAgICAgICAgIGVsc2UgVXRpbHMuc2V0V2luZG93UHJlZmVyZW5jZShcImJhY2tncm91bmRDb2xvclwiLCBcIiMyZjMxMzZcIik7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgaWYgKGlkID09IFwiYmRhLWdzLThcIikge1xyXG4gICAgICAgICAgICBpZiAoZW5hYmxlZCkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgICAgIGVsc2UgZE1vZGUuc3RvcERlYnVnTGlzdGVuZXIoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PSBcImZvcmstZG0tMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG4gICAgICAgICAgICBlbHNlIGRNb2RlLnN0b3BDb3B5U2VsZWN0b3IoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmRldk1vZGUgPSB0cnVlXHJcbiAgICAgICAgICAgIGVsc2Ugd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gZmFsc2VcclxuICAgICAgICAgICAgc2lkZWJhci5mb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICAgICAgZWxzZSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IGZhbHNlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZW5hYmxlKClcclxuICAgICAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzU3RvcmUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIHR5cGVvZiBlLmRlZmF1bHQgPT09IFwib2JqZWN0XCIgJiYgXCJzaG93Q3VycmVudEdhbWVcIiBpbiBlLmRlZmF1bHQpWzBdXHJcbiAgICAgICAgICAgICAgICBpZihzZXR0aW5nc1N0b3JlICYmICFzZXR0aW5nc1N0b3JlLmRlZmF1bHQuc2hvd0N1cnJlbnRHYW1lKXtcclxuICAgICAgICAgICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncylbMF0uZGVmYXVsdC51cGRhdGVSZW1vdGVTZXR0aW5ncyh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50R2FtZTogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBDdXN0b21SaWNoUHJlc2VuY2UuZGlzYWJsZSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtM1wiKSB7XHJcbiAgICAgICAgICAgIGlmIChlbmFibGVkKSByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLnNldEFsd2F5c09uVG9wKHRydWUpXHJcbiAgICAgICAgICAgIGVsc2UgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5zZXRBbHdheXNPblRvcChmYWxzZSlcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImxpZ2h0Y29yZC00XCIpIHtcclxuICAgICAgICAgICAgaWYoZW5hYmxlZCl7XHJcbiAgICAgICAgICAgICAgICBBbnRpQWRETS5lbmFibGUoKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIEFudGlBZERNLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtNlwiKSB7XHJcbiAgICAgICAgICAgIGlmKGVuYWJsZWQpe1xyXG4gICAgICAgICAgICAgICAgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBibHVyUHJpdmF0ZS5kaXNhYmxlKClcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoaWQgPT09IFwibGlnaHRjb3JkLTdcIikge1xyXG4gICAgICAgICAgICBpZihlbmFibGVkKXtcclxuICAgICAgICAgICAgICAgIGRpc2FibGVUeXBpbmcuZW5hYmxlKClcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBkaXNhYmxlVHlwaW5nLmRpc2FibGUoKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOFwiKXtcclxuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcImlzVGFic1wiLCBlbmFibGVkKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zYXZlKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5yZWxhdW5jaCgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAuZXhpdCgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtOVwiKSB7XHJcbiAgICAgICAgICAgIHBvcG91dFdpbmRvd1tlbmFibGVkID8gXCJlbmFibGVcIiA6IFwiZGlzYWJsZVwiXSgpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpZCA9PT0gXCJsaWdodGNvcmQtMTBcIil7XHJcbiAgICAgICAgICAgIGNvcmUubWV0aG9kcy5Ob3RpZmljYXRpb25zVXNlU2hpbShlbmFibGVkKVxyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcIm5vX3dpbmRvd19ib3VuZFwiKXtcclxuICAgICAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNldChcIk5PX1dJTkRPV1NfQk9VTkRcIiwgZW5hYmxlZClcclxuXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIklTX01BWElNSVpFRFwiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5kZWxldGUoXCJJU19NSU5JTUlaRURcIikgXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLmRlbGV0ZShcIldJTkRPV19CT1VORFNcIilcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGFwcFNldHRpbmdzLnNhdmUoKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLnJlbGF1bmNoKClcclxuICAgICAgICAgICAgcmVtb3RlLmFwcC5leGl0KClcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIil7XHJcbiAgICAgICAgICAgIGxldCBhcHBTZXR0aW5ncyA9IHJlbW90ZS5nZXRHbG9iYWwoXCJhcHBTZXR0aW5nc1wiKVxyXG4gICAgICAgICAgICBhcHBTZXR0aW5ncy5zZXQoXCJHTEFTU1RST05cIiwgZW5hYmxlZClcclxuICAgICAgICAgICAgYXBwU2V0dGluZ3Muc2F2ZSgpXHJcbiAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goKVxyXG4gICAgICAgICAgICByZW1vdGUuYXBwLmV4aXQoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zYXZlU2V0dGluZ3MoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0aWFsaXplU2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTJcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWxcIik7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTNcIl0pIERPTS5hZGRDbGFzcyhkb2N1bWVudC5ib2R5LCBcImJkLW1pbmltYWwtY2hhblwiKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtMVwiXSkgcHVibGljU2VydmVyc01vZHVsZS5hZGRCdXR0b24oKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtNFwiXSkgdm9pY2VNb2RlLnN0YXJ0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTVcIl0pIERPTS5hZGRDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkYS1kYXJrXCIpO1xyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImJkYS1ncy02XCJdKSB0ZkhvdXIuaW5qZWN0MjRIb3VyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiYmRhLWdzLTdcIl0pIGNvbG9yZWRUZXh0LmluamVjdENvbG9yZWRUZXh0KCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy00XCJdKSBDbGFzc05vcm1hbGl6ZXIuc3RhcnQoKTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtMVwiXSkgd2luZG93LkxpZ2h0Y29yZC5TZXR0aW5ncy5kZXZNb2RlID0gdHJ1ZVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC0yXCJdKSB3aW5kb3cuTGlnaHRjb3JkLlNldHRpbmdzLmNhbGxSaW5naW5nQmVhdCA9IHRydWVcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtcHJlc2VuY2UtMVwiXSkgQ3VzdG9tUmljaFByZXNlbmNlLmVuYWJsZSgpXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wibGlnaHRjb3JkLTNcIl0pIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0QWx3YXlzT25Ub3AodHJ1ZSlcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNFwiXSkgQW50aUFkRE0uZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtNlwiXSkgYmx1clByaXZhdGUuZW5hYmxlKClcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJsaWdodGNvcmQtN1wiXSkgZGlzYWJsZVR5cGluZy5lbmFibGUoKVxyXG4gICAgICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImxpZ2h0Y29yZC05XCJdKSBwb3BvdXRXaW5kb3cuZW5hYmxlKClcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdKSB7XHJcbiAgICAgICAgICAgIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInBsdWdpblwiKTtcclxuICAgICAgICAgICAgQ29udGVudE1hbmFnZXIud2F0Y2hDb250ZW50KFwidGhlbWVcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJiZGEtZ3MtOFwiXSkgZE1vZGUuc3RhcnREZWJ1Z0xpc3RlbmVyKCk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1kbS0xXCJdKSBkTW9kZS5zdGFydENvcHlTZWxlY3RvcigpO1xyXG5cclxuICAgICAgICB0aGlzLnNhdmVTZXR0aW5ncygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNhdmVTZXR0aW5ncygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIiwgc2V0dGluZ3NDb29raWUpO1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJycGNcIiwgc2V0dGluZ3NSUEMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxvYWRTZXR0aW5ncygpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzQ29va2llLCBEYXRhU3RvcmUuZ2V0U2V0dGluZ0dyb3VwKFwic2V0dGluZ3NcIikpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3NSUEMsIERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJycGNcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlclNpZGViYXIoc2lkZWJhcikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNpZGViYXIucmVuZGVyKHNpZGViYXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvcmVDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZWN0aW9uZWRTZXR0aW5nc1BhbmVsLCB7a2V5OiBcImNzcGFuZWxcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIHNlY3Rpb25zOiB0aGlzLmNvcmVTZXR0aW5nc30pXHJcbiAgICB9XHJcblxyXG4gICAgbGlnaHRjb3JkQ29tcG9uZW50KHNpZGViYXIsIGZvcmNlVXBkYXRlKSB7XHJcbiAgICAgICAgbGV0IGFwcFNldHRpbmdzID0gcmVtb3RlLmdldEdsb2JhbChcImFwcFNldHRpbmdzXCIpXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgdGhpcy5saWdodGNvcmRTZXR0aW5ncy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgKGkgPT09IDAgPyBudWxsIDogQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KE1hcmdpblRvcCkpLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImgyXCIsIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSwgc2VjdGlvbi50aXRsZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5zZXR0aW5ncy5tYXAoc2V0dGluZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0NoZWNrZWQgPSBzZXR0aW5nc0Nvb2tpZVtzZXR0aW5nLmlkXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImxpZ2h0Y29yZC04XCIpaXNDaGVja2VkID0gYXBwU2V0dGluZ3MuZ2V0KFwiaXNUYWJzXCIsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJub193aW5kb3dfYm91bmRcIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJOT19XSU5ET1dTX0JPVU5EXCIsIGZhbHNlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihzZXR0aW5nLmlkID09PSBcImVuYWJsZV9nbGFzc3Ryb25cIilpc0NoZWNrZWQgPSBhcHBTZXR0aW5ncy5nZXQoXCJHTEFTU1RST05cIiwgdHJ1ZSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PT0gXCJsaWdodGNvcmQtMTBcIilpc0NoZWNrZWQgPSAhYXBwU2V0dGluZ3MuZ2V0KFwiREVGQVVMVF9OT1RJRklDQVRJT05TXCIsIHRydWUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtpZDogc2V0dGluZy5pZCwga2V5OiBzZXR0aW5nLmlkLCBkYXRhOiBzZXR0aW5nLCBjaGVja2VkOiBpc0NoZWNrZWQsIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoaWQsIGNoZWNrZWQsIHNpZGViYXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2V0dGluZy5pZCA9PSBcImxpZ2h0Y29yZC04XCIgJiYgaXNDaGVja2VkKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogXCJncmVlblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rOiBcIm91dGxpbmVkXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU6IFwic21hbGxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJicmFuZFwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNjb3JkTmF0aXZlLmlwYy5zZW5kKFwiTkVXX1RBQlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVyOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgXCJPcGVuIGEgbmV3IFRhYlwiKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBdXHJcbiAgICAgICAgICAgIH0pLCBcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2soKXtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIlNob3VsZCByZWxhdW5jaFwiKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucmVsYXVuY2goe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiByZW1vdGUucHJvY2Vzcy5hcmd2LnNsaWNlKDEpLmNvbmNhdChbXCItLWRpc2FibGUtYmV0dGVyZGlzY29yZFwiXSlcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHJlbW90ZS5hcHAucXVpdCgpXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZVxyXG4gICAgICAgICAgICB9LCBcIlJlbGF1bmNoIHdpdGhvdXQgQmV0dGVyRGlzY29yZFwiKSxcclxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiwge1xyXG4gICAgICAgICAgICAgICAgY29sb3I6IFwieWVsbG93XCIsXHJcbiAgICAgICAgICAgICAgICBsb29rOiBcImdob3N0XCIsXHJcbiAgICAgICAgICAgICAgICBzaXplOiBcIm1lZGl1bVwiLFxyXG4gICAgICAgICAgICAgICAgaG92ZXJDb2xvcjogXCJyZWRcIixcclxuICAgICAgICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZihpc0NsZWFyaW5nQ2FjaGUpcmV0dXJuXHJcbiAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNsZWFyaW5nIGNhY2hlLi4uXCIsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJpbmZvXCJcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgICAgICAgICByZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkuc2Vzc2lvbi5jbGVhckNhY2hlKClcclxuICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkNhY2hlIGlzIGNsZWFyZWQgIVwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN1Y2Nlc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0NsZWFyaW5nQ2FjaGUgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVVwZGF0ZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQuIENoZWNrIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLlwiLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhcmluZ0NhY2hlID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgd3JhcHBlcjogdHJ1ZSxcclxuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0NsZWFyaW5nQ2FjaGVcclxuICAgICAgICAgICAgfSwgXCJDbGVhciBjYWNoZVwiKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBQcmVzZW5jZUNvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19QcmVzZW5jZVNldHRpbmdzLCB7XHJcbiAgICAgICAgICAgIGtleTogXCJscHBhbm5lbFwiLFxyXG4gICAgICAgICAgICBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgXHJcbiAgICAgICAgICAgIHNldHRpbmdzOiB0aGlzLlByZXNlbmNlU2V0dGluZ3NcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFjY291bnRJbmZvc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFYyQ19BY2NvdW50SW5mb3MsIHtcclxuICAgICAgICAgICAga2V5OiBcImxhcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIEFwaVByZXZpZXdDb21wb25lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChBcGlQcmV2aWV3LCB7XHJcbiAgICAgICAgICAgIGtleTogXCJsYXBpcGFubmVsXCJcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGN1c3RvbUNzc0NvbXBvbmVudCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENzc0VkaXRvciwge2tleTogXCJjc3NlZGl0b3JcIn0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyQWRkb25QYW5lKHR5cGUpIHtcclxuICAgICAgICAvLyBJIGtub3cgdGhpcyBzaG91bGRuJ3QgYmUgaGVyZSwgYnV0IHdoZW4gaXQgaXNuJ3QsXHJcbiAgICAgICAgLy8gUmVhY3QgcmVmdXNlcyB0byBjaGFuZ2UgdGhlIGJ1dHRvbiB3aGVuIGdvaW5nXHJcbiAgICAgICAgLy8gYmV0d2VlbiBwbHVnaW5zIGFuZCB0aGVtZXMgcGFnZS4uLiBzb21ldGhpbmdcclxuICAgICAgICAvLyB0byBkZWJ1ZyBsYXRlci5cclxuICAgICAgICBjbGFzcyBDb250ZW50TGlzdCBleHRlbmRzIEJEVjIucmVhY3QuQ29tcG9uZW50IHtcclxuICAgICAgICAgICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICAgICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJlZml4ID0gdGhpcy5wcm9wcy50eXBlLnJlcGxhY2UoXCJzXCIsIFwiXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZSh0aGlzLnByb3BzLnR5cGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIHJlbmRlcigpIHtyZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjt9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsUmVuZGVyID0gQ29udGVudExpc3QucHJvdG90eXBlLnJlbmRlcjtcclxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ29udGVudExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgICAgICAgICBnZXQ6ICgpID0+IG9yaWdpbmFsUmVuZGVyXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29udGVudExpc3QsIHt0eXBlfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENhcmRMaXN0LCB7dHlwZX0pKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBObyBuZWVkIHRvIGV4cG9ydCBzZXR0aW5nc1BhbmVsIG9uIHdpbmRvd1xyXG4gKi9cclxuXHJcbmZ1bmN0aW9uIG1ha2VDb21wb25lbnQoY2hpbGRyZW4pe1xyXG4gICAgY2xhc3MgU2V0dGluZ0NvbXBvbmVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICAgICAgcmVuZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBjaGlsZHJlbihzaWRlYmFyLCAoKSA9PiB0aGlzLmZvcmNlVXBkYXRlKCkpXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgbGV0IHNpZGViYXJcclxuICAgIHJldHVybiAocykgPT4ge1xyXG4gICAgICAgIHNpZGViYXIgPSBzXHJcbiAgICAgICAgcmV0dXJuIFNldHRpbmdDb21wb25lbnRcclxuICAgIH1cclxufSIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyX1NldHRpbmdzUGFuZWxfU2lkZWJhciB7XHJcblxyXG4gICAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAgICAgdGhpcy5wYW5lbHMgPSB7fVxyXG4gICAgfVxyXG5cclxuICAgIHJlZ2lzdGVyKHBhbmVsLCBjb21wb25lbnQpe1xyXG4gICAgICAgIHRoaXMucGFuZWxzW3BhbmVsXSA9IGNvbXBvbmVudFxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudChwYW5lbCwgc2lkZWJhcil7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucGFuZWxzW3BhbmVsXShzaWRlYmFyKVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBpdGVtcygpIHtcclxuICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgICAgdGV4dDogXCJCZXR0ZXJEaXNjb3JkIFNldHRpbmdzXCIsIFxyXG4gICAgICAgICAgICBpZDogXCJjb3JlXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiUGx1Z2luc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwicGx1Z2luc1wiXHJcbiAgICAgICAgfSwge1xyXG4gICAgICAgICAgICB0ZXh0OiBcIlRoZW1lc1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwidGhlbWVzXCJcclxuICAgICAgICB9LCB7XHJcbiAgICAgICAgICAgIHRleHQ6IFwiQ3VzdG9tIENTU1wiLCBcclxuICAgICAgICAgICAgaWQ6IFwiY3VzdG9tY3NzXCJcclxuICAgICAgICB9XTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENpdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJMaWdodGNvcmQgU2V0dGluZ3NcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImxpZ2h0Y29yZFwiXHJcbiAgICAgICAgICAgIH0sIHtcclxuICAgICAgICAgICAgICAgIHRleHQ6IFwiUmljaFByZXNlbmNlXCIsIFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwic3RhdHVzXCJcclxuICAgICAgICAgICAgfSwge1xyXG4gICAgICAgICAgICAgICAgdGV4dDogXCJBY2NvdW50IEluZm9cIixcclxuICAgICAgICAgICAgICAgIGlkOiBcImFjY291bnRpbmZvXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF1cclxuICAgICAgICByZXR1cm4gaXRlbXNcclxuICAgIH1cclxuXHJcbiAgICBnZXQgTENEZXZJdGVtcygpe1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtdXHJcbiAgICAgICAgaWYoIXdpbmRvdy5MaWdodGNvcmQuU2V0dGluZ3MuZGV2TW9kZSlyZXR1cm4gaXRlbXNcclxuICAgICAgICBpdGVtcy5wdXNoKC4uLltcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJIRUFERVJcIixcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIkxpZ2h0Y29yZCBBcGlcIlxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICB0ZXh0OiBcIkNvbXBvbmVudHMgUHJldmlld1wiLFxyXG4gICAgICAgICAgICAgICAgaWQ6IFwibGNhcGlwcmV2aWV3XCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIF0pXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKHNpZGViYXIpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkhFQURFUlwiLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiTGlnaHRjb3JkXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4udGhpcy5MQ2l0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAuLi50aGlzLkxDRGV2SXRlbXMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYoZS5zZWN0aW9uKXJldHVybiBlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb246IGUuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGUudGV4dCxcclxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50OiB0aGlzLmdldENvbXBvbmVudChlLmlkLCBzaWRlYmFyKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJESVZJREVSXCJcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgc2VjdGlvbjogXCJDVVNUT01cIixcclxuICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KFwiQkRDaGFuZ2Vsb2dUaXRsZVwiKVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAuLi50aGlzLml0ZW1zLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbjogZS5pZCxcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS50ZXh0LFxyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ6IHRoaXMuZ2V0Q29tcG9uZW50KGUuaWQsIHNpZGViYXIpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBzZWN0aW9uOiBcIkRJVklERVJcIlxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG59XHJcblxyXG4vKipcclxuICogTm8gbmVlZCB0byBleHBvcnQgc2V0dGluZ3NQYW5lbFNpZGViYXIgb24gd2luZG93XHJcbiAqLyIsImltcG9ydCB7YmR0aGVtZUVycm9ycywgdGhlbWVDb29raWUsIHNldHRpbmdzQ29va2llLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgQkRFdmVudHMgZnJvbSBcIi4vYmRFdmVudHNcIjtcclxuaW1wb3J0IFV0aWxzIGZyb20gXCIuL3V0aWxzXCI7XHJcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuaW1wb3J0IGJkRXZlbnRzIGZyb20gXCIuL2JkRXZlbnRzXCI7XHJcblxyXG5jbGFzcyBUaGVtZU1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3Rvcigpe1xyXG4gICAgICAgIHdpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5UaGVtZU1vZHVsZSA9IHRoaXNcclxuICAgIH1cclxuICAgIGdldCBmb2xkZXIoKSB7cmV0dXJuIENvbnRlbnRNYW5hZ2VyLnRoZW1lc0ZvbGRlcjt9XHJcbn1cclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVzID0gYXN5bmMgZnVuY3Rpb24gKCkge1xyXG4gICAgdGhpcy5sb2FkVGhlbWVEYXRhKCk7XHJcbiAgICBiZHRoZW1lRXJyb3JzLnNwbGljZSgwLCAwLCAuLi4oYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZFRoZW1lcygpKSk7XHJcbiAgICBjb25zdCB0aGVtZXMgPSBPYmplY3Qua2V5cyhiZHRoZW1lcyk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGVtZXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWVzW3RoZW1lc1tpXV07XHJcbiAgICAgICAgaWYgKCF0aGVtZUNvb2tpZVt0aGVtZS5uYW1lXSkgdGhlbWVDb29raWVbdGhlbWUubmFtZV0gPSBmYWxzZTtcclxuICAgICAgICBpZiAodGhlbWVDb29raWVbdGhlbWUubmFtZV0pIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgMTApKVxyXG4gICAgfVxyXG4gICAgZm9yIChjb25zdCB0aGVtZSBpbiB0aGVtZUNvb2tpZSkge1xyXG4gICAgICAgIGlmICghYmR0aGVtZXNbdGhlbWVdKSBkZWxldGUgdGhlbWVDb29raWVbdGhlbWVdO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYXZlVGhlbWVEYXRhKCk7XHJcbiAgICAvLyBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTVcIl0pIENvbnRlbnRNYW5hZ2VyLndhdGNoQ29udGVudChcInRoZW1lXCIpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZVRoZW1lID0gZnVuY3Rpb24obmFtZSwgcmVsb2FkID0gZmFsc2UpIHtcclxuICAgIHRoZW1lQ29va2llW25hbWVdID0gdHJ1ZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5hZGRTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpLCB1bmVzY2FwZSh0aGVtZS5jc3MpKTtcclxuICAgIGJkRXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtZW5hYmxlZFwiKVxyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdICYmICFyZWxvYWQpIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSBoYXMgYmVlbiBhcHBsaWVkLmApO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLmVuYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZW5hYmxlVGhlbWUobmFtZSwgcmVsb2FkKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kaXNhYmxlVGhlbWUgPSBmdW5jdGlvbihuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgdGhlbWVDb29raWVbbmFtZV0gPSBmYWxzZTtcclxuICAgIHRoaXMuc2F2ZVRoZW1lRGF0YSgpO1xyXG4gICAgY29uc3QgdGhlbWUgPSBiZHRoZW1lc1tuYW1lXTtcclxuICAgIERPTS5yZW1vdmVTdHlsZShET00uZXNjYXBlSUQodGhlbWUuaWQpKTtcclxuICAgIGJkRXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtZGlzYWJsZWRcIilcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSAmJiAhcmVsb2FkKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gaGFzIGJlZW4gZGlzYWJsZWQuYCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZGlzYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCByZWxvYWQgPSBmYWxzZSkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVRoZW1lKG5hbWUsIHJlbG9hZCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudG9nZ2xlVGhlbWUgPSBmdW5jdGlvbih0aGVtZSkge1xyXG4gICAgaWYgKHRoZW1lQ29va2llW3RoZW1lXSkgdGhpcy5kaXNhYmxlVGhlbWUodGhlbWUpO1xyXG4gICAgZWxzZSB0aGlzLmVuYWJsZVRoZW1lKHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS50b2dnbGUgPSBmdW5jdGlvbiAobmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9nZ2xlVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUubG9hZFRoZW1lID0gYXN5bmMgZnVuY3Rpb24oZmlsZW5hbWUpIHtcclxuICAgIGNvbnN0IGVycm9yID0gYXdhaXQgQ29udGVudE1hbmFnZXIubG9hZENvbnRlbnQoZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHtmaWxlbmFtZX0gY291bGQgbm90IGJlIGxvYWRlZC4gSXQgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7ZmlsZW5hbWV9IGNvdWxkIG5vdCBiZSBsb2FkZWQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZSk7XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZS5uYW1lfSB2JHt0aGVtZS52ZXJzaW9ufSB3YXMgbG9hZGVkLmApO1xyXG4gICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWUubmFtZX0gdiR7dGhlbWUudmVyc2lvbn0gd2FzIGxvYWRlZC5gLCB7dHlwZTogXCJzdWNjZXNzXCJ9KTtcclxuICAgIEJERXZlbnRzLmRpc3BhdGNoKFwidGhlbWUtbG9hZGVkXCIsIHRoZW1lLm5hbWUpO1xyXG59O1xyXG5cclxuVGhlbWVNb2R1bGUucHJvdG90eXBlLnVubG9hZFRoZW1lID0gZnVuY3Rpb24oZmlsZW5hbWVPck5hbWUpIHtcclxuICAgIGNvbnN0IGJkdGhlbWUgPSBPYmplY3QudmFsdWVzKGJkdGhlbWVzKS5maW5kKHAgPT4gcC5maWxlbmFtZSA9PSBmaWxlbmFtZU9yTmFtZSkgfHwgYmR0aGVtZXNbZmlsZW5hbWVPck5hbWVdO1xyXG4gICAgaWYgKCFiZHRoZW1lKSByZXR1cm47XHJcbiAgICBjb25zdCB0aGVtZSA9IGJkdGhlbWUubmFtZTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKTtcclxuICAgIGNvbnN0IGVycm9yID0gQ29udGVudE1hbmFnZXIudW5sb2FkQ29udGVudChiZHRoZW1lc1t0aGVtZV0uZmlsZW5hbWUsIFwidGhlbWVcIik7XHJcbiAgICBkZWxldGUgYmR0aGVtZXNbdGhlbWVdO1xyXG4gICAgaWYgKGVycm9yKSB7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0xXCJdKSBVdGlscy5zaG93Q29udGVudEVycm9ycyh7dGhlbWVzOiBbZXJyb3JdfSk7XHJcbiAgICAgICAgaWYgKHNldHRpbmdzQ29va2llW1wiZm9yay1wcy0yXCJdKSBVdGlscy5zaG93VG9hc3QoYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSB1bmxvYWRlZC4gSXQgbWF5IGhhdmUgbm90IGJlZW4gbG9hZGVkIHlldC5gLCB7dHlwZTogXCJlcnJvclwifSk7XHJcbiAgICAgICAgcmV0dXJuIFV0aWxzLmVycihcIkNvbnRlbnRNYW5hZ2VyXCIsIGAke3RoZW1lfSBjb3VsZCBub3QgYmUgdW5sb2FkZWQuIEl0IG1heSBoYXZlIG5vdCBiZWVuIGxvYWRlZCB5ZXQuYCwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgVXRpbHMubG9nKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IHdhcyB1bmxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB3YXMgdW5sb2FkZWQuYCwge3R5cGU6IFwic3VjY2Vzc1wifSk7XHJcbiAgICBCREV2ZW50cy5kaXNwYXRjaChcInRoZW1lLXVubG9hZGVkXCIsIHRoZW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbihmaWxlbmFtZU9yTmFtZSkge1xyXG4gICAgY29uc3QgYmR0aGVtZSA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkdGhlbWUpIHJldHVybjtcclxuICAgIHRoaXMudW5sb2FkVGhlbWUoYmR0aGVtZS5maWxlbmFtZSk7XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHRoZW1lLmZpbGVuYW1lKTtcclxuICAgIHJlcXVpcmUoXCJmc1wiKS51bmxpbmtTeW5jKGZ1bGxQYXRoKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5yZWxvYWRUaGVtZSA9IGFzeW5jIGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHRoZW1lID0gT2JqZWN0LnZhbHVlcyhiZHRoZW1lcykuZmluZChwID0+IHAuZmlsZW5hbWUgPT0gZmlsZW5hbWVPck5hbWUpIHx8IGJkdGhlbWVzW2ZpbGVuYW1lT3JOYW1lXTtcclxuICAgIGlmICghYmR0aGVtZSkgcmV0dXJuIHRoaXMubG9hZFRoZW1lKGZpbGVuYW1lT3JOYW1lKTtcclxuICAgIGNvbnN0IHRoZW1lID0gYmR0aGVtZS5uYW1lO1xyXG4gICAgY29uc3QgZXJyb3IgPSBhd2FpdCBDb250ZW50TWFuYWdlci5yZWxvYWRDb250ZW50KGJkdGhlbWVzW3RoZW1lXS5maWxlbmFtZSwgXCJ0aGVtZVwiKTtcclxuICAgIGlmICh0aGVtZUNvb2tpZVt0aGVtZV0pIHRoaXMuZGlzYWJsZVRoZW1lKHRoZW1lLCB0cnVlKSwgdGhpcy5lbmFibGVUaGVtZSh0aGVtZSwgdHJ1ZSk7XHJcbiAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTFcIl0pIFV0aWxzLnNob3dDb250ZW50RXJyb3JzKHt0aGVtZXM6IFtlcnJvcl19KTtcclxuICAgICAgICBpZiAoc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTJcIl0pIFV0aWxzLnNob3dUb2FzdChgJHt0aGVtZX0gY291bGQgbm90IGJlIHJlbG9hZGVkLmAsIHt0eXBlOiBcImVycm9yXCJ9KTtcclxuICAgICAgICByZXR1cm4gVXRpbHMuZXJyKFwiQ29udGVudE1hbmFnZXJcIiwgYCR7dGhlbWV9IGNvdWxkIG5vdCBiZSByZWxvYWRlZC5gLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgICBVdGlscy5sb2coXCJDb250ZW50TWFuYWdlclwiLCBgJHt0aGVtZX0gdiR7YmR0aGVtZXNbdGhlbWVdLnZlcnNpb259IHdhcyByZWxvYWRlZC5gKTtcclxuICAgIGlmIChzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtMlwiXSkgVXRpbHMuc2hvd1RvYXN0KGAke3RoZW1lfSB2JHtiZHRoZW1lc1t0aGVtZV0udmVyc2lvbn0gd2FzIHJlbG9hZGVkLmAsIHt0eXBlOiBcInN1Y2Nlc3NcIn0pO1xyXG4gICAgQkRFdmVudHMuZGlzcGF0Y2goXCJ0aGVtZS1yZWxvYWRlZFwiLCB0aGVtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUucmVsb2FkID0gZnVuY3Rpb24obmFtZSkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVsb2FkVGhlbWUobmFtZSk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuZWRpdCA9IGZ1bmN0aW9uKGZpbGVuYW1lT3JOYW1lKSB7XHJcbiAgICBjb25zdCBiZHBsdWdpbiA9IE9iamVjdC52YWx1ZXMoYmR0aGVtZXMpLmZpbmQocCA9PiBwLmZpbGVuYW1lID09IGZpbGVuYW1lT3JOYW1lKSB8fCBiZHRoZW1lc1tmaWxlbmFtZU9yTmFtZV07XHJcbiAgICBpZiAoIWJkcGx1Z2luKSByZXR1cm47XHJcbiAgICBjb25zdCBmdWxsUGF0aCA9IHJlcXVpcmUoXCJwYXRoXCIpLnJlc29sdmUoQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyLCBiZHBsdWdpbi5maWxlbmFtZSk7XHJcbiAgICByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGwub3Blbkl0ZW0oYCR7ZnVsbFBhdGh9YCk7XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUudXBkYXRlVGhlbWVMaXN0ID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCByZXN1bHRzID0gQ29udGVudE1hbmFnZXIubG9hZE5ld0NvbnRlbnQoXCJ0aGVtZVwiKTtcclxuICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgcmVzdWx0cy5hZGRlZCkgdGhpcy5sb2FkVGhlbWUoZmlsZW5hbWUpO1xyXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHJlc3VsdHMucmVtb3ZlZCkgdGhpcy51bmxvYWRUaGVtZShuYW1lKTtcclxufTtcclxuXHJcblRoZW1lTW9kdWxlLnByb3RvdHlwZS5sb2FkVGhlbWVEYXRhID0gZnVuY3Rpb24oKSB7XHJcbiAgICBjb25zdCBzYXZlZCA9IERhdGFTdG9yZS5nZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIik7XHJcbiAgICBpZiAoc2F2ZWQpIHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKHRoZW1lQ29va2llLCBzYXZlZCk7XHJcbiAgICB9XHJcbn07XHJcblxyXG5UaGVtZU1vZHVsZS5wcm90b3R5cGUuc2F2ZVRoZW1lRGF0YSA9IGZ1bmN0aW9uICgpIHtcclxuICAgIERhdGFTdG9yZS5zZXRTZXR0aW5nR3JvdXAoXCJ0aGVtZXNcIiwgdGhlbWVDb29raWUpO1xyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IFRoZW1lTW9kdWxlKCk7IiwiaW1wb3J0IHtiYmRWZXJzaW9ufSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcbmltcG9ydCBXZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi93ZWJwYWNrTW9kdWxlc1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFV0aWxzIHtcbiAgICAvKiogRG9jdW1lbnQvd2luZG93IHdpZHRoICovXG4gICAgc3RhdGljIGdldCBzY3JlZW5XaWR0aCgpIHsgcmV0dXJuIE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCwgd2luZG93LmlubmVyV2lkdGggfHwgMCk7IH1cbiAgICAvKiogRG9jdW1lbnQvd2luZG93IGhlaWdodCAqL1xuICAgIHN0YXRpYyBnZXQgc2NyZWVuSGVpZ2h0KCkgeyByZXR1cm4gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IDApOyB9XG5cbiAgICBzdGF0aWMgZ2V0IFdpbmRvd0NvbmZpZ0ZpbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl93aW5kb3dDb25maWdGaWxlID0gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0QWxsV2luZG93UHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgICAgIGZyYW1lOiBmYWxzZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgZ2V0V2luZG93UHJlZmVyZW5jZShrZXkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJ0cmFuc3BhcmVudFwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJmcmFtZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBcbiAgICBzdGF0aWMgc2V0V2luZG93UHJlZmVyZW5jZShrZXksIHZhbHVlKSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZnJhbWVcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgc3RyaXBCT00oY29udGVudCkge1xuICAgICAgICBpZiAoY29udGVudC5jaGFyQ29kZUF0KDApID09PSAweEZFRkYpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnNsaWNlKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZW50O1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXRUZXh0QXJlYSgpIHtcbiAgICAgICAgcmV0dXJuIERPTS5xdWVyeShcIi5cIityZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGFubmVsVGV4dEFyZWEgJiYgZS50aXRsZVdyYXBwZXIpWzBdLmNoYW5uZWxUZXh0QXJlYSkrXCIgdGV4dGFyZWFcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIGluc2VydFRleHQodGV4dGFyZWEsIHRleHQpIHtcbiAgICAgICAgdGV4dGFyZWEuZm9jdXMoKTtcbiAgICAgICAgdGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgICAgICB0ZXh0YXJlYS5zZWxlY3Rpb25FbmQgPSB0ZXh0YXJlYS52YWx1ZS5sZW5ndGg7XG4gICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKFwiaW5zZXJ0VGV4dFwiLCBmYWxzZSwgdGV4dCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVzY2FwZUlEKGlkKSB7XG4gICAgICAgIHJldHVybiBpZC5yZXBsYWNlKC9eW15hLXpdK3xbXlxcdy1dKy9naSwgXCItXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBsb2cobW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLmxvZyhgJWNbQmFuZGFnZWRCRF0lYyBbJHttb2R1bGVOYW1lfV0lYyAke21lc3NhZ2V9YCwgXCJjb2xvcjogIzNhNzFjMTsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogIzNhNzFjMTtcIiwgXCJcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHdhcm4obW9kdWxlTmFtZSwgbWVzc2FnZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6ICNFOEE0MDA7IGZvbnQtd2VpZ2h0OiA3MDA7XCIsIFwiY29sb3I6ICNFOEE0MDA7XCIsIFwiXCIpO1xuICAgIH1cblxuICAgIHN0YXRpYyBlcnIobW9kdWxlTmFtZSwgbWVzc2FnZSwgZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCVjW0JhbmRhZ2VkQkRdJWMgWyR7bW9kdWxlTmFtZX1dJWMgJHttZXNzYWdlfWAsIFwiY29sb3I6IHJlZDsgZm9udC13ZWlnaHQ6IDcwMDtcIiwgXCJjb2xvcjogcmVkO1wiLCBcIlwiKTtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwQ29sbGFwc2VkKFwiJWNFcnJvcjogXCIgKyBlcnJvci5tZXNzYWdlLCBcImNvbG9yOiByZWQ7XCIpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvci5zdGFjayk7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXQgc3RyaW5ncyB3aXRoIHBsYWNlaG9sZGVycyAoYHt7cGxhY2Vob2xkZXJ9fWApIGludG8gZnVsbCBzdHJpbmdzLlxuICAgICAqIFF1aWNrIGV4YW1wbGU6IGBQbHVnaW5VdGlsaXRpZXMuZm9ybWF0U3RyaW5nKFwiSGVsbG8sIHt7dXNlcn19XCIsIHt1c2VyOiBcIlplcmVib3NcIn0pYFxuICAgICAqIHdvdWxkIHJldHVybiBcIkhlbGxvLCBaZXJlYm9zXCIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyAtIHN0cmluZyB0byBmb3JtYXRcbiAgICAgKiBAcGFyYW0ge29iamVjdH0gdmFsdWVzIC0gb2JqZWN0IGxpdGVyYWwgb2YgcGxhY2Vob2xkZXJzIHRvIHJlcGxhY2VtZW50c1xuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBwcm9wZXJseSBmb3JtYXR0ZWQgc3RyaW5nXG4gICAgICovXG4gICAgc3RhdGljIGZvcm1hdFN0cmluZyhzdHJpbmcsIHZhbHVlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBpbiB2YWx1ZXMpIHtcbiAgICAgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHZhbHVlc1t2YWxdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVwbGFjZW1lbnQpKSByZXBsYWNlbWVudCA9IEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50KTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YocmVwbGFjZW1lbnQpID09PSBcIm9iamVjdFwiICYmIHJlcGxhY2VtZW50ICE9PSBudWxsKSByZXBsYWNlbWVudCA9IHJlcGxhY2VtZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShuZXcgUmVnRXhwKGB7eyR7dmFsfX19YCwgXCJnXCIpLCByZXBsYWNlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICB9XG5cbiAgICBzdGF0aWMgZXNjYXBlKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvWy0vXFxcXF4kKis/LigpfFtcXF17fV0vZywgXCJcXFxcJCZcIik7XG4gICAgfVxuXG4gICAgc3RhdGljIHRlc3RKU09OKGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBpc0VtcHR5KG9iaikge1xuICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqID09IHVuZGVmaW5lZCB8fCBvYmogPT0gXCJcIikgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yob2JqKSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSByZXR1cm4gb2JqLmxlbmd0aCA9PSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdXBwcmVzc0Vycm9ycyhtZXRob2QsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuICguLi5wYXJhbXMpID0+IHtcbiAgICAgICAgICAgIHRyeSB7IHJldHVybiBtZXRob2QoLi4ucGFyYW1zKTtcdH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7IHRoaXMuZXJyKFwiU3VwcHJlc3NlZEVycm9yXCIsIFwiRXJyb3Igb2NjdXJyZWQgaW4gXCIgKyBtZXNzYWdlLCBlKTsgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHN0YXRpYyBtb25rZXlQYXRjaCh3aGF0LCBtZXRob2ROYW1lLCBvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHtiZWZvcmUsIGFmdGVyLCBpbnN0ZWFkLCBvbmNlID0gZmFsc2UsIHNpbGVudCA9IGZhbHNlLCBmb3JjZSA9IGZhbHNlfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gb3B0aW9ucy5kaXNwbGF5TmFtZSB8fCB3aGF0LmRpc3BsYXlOYW1lIHx8IHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUgfHwgd2hhdC5uYW1lIHx8IHdoYXQuY29uc3RydWN0b3IuZGlzcGxheU5hbWUgfHwgd2hhdC5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICBpZiAoIXNpbGVudCkgY29uc29sZS5sb2coXCJwYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXSkge1xuICAgICAgICAgICAgaWYgKGZvcmNlKSB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7fTtcbiAgICAgICAgICAgIGVsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IobWV0aG9kTmFtZSwgXCJkb2VzIG5vdCBleGlzdCBmb3JcIiwgZGlzcGxheU5hbWUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmlnTWV0aG9kID0gd2hhdFttZXRob2ROYW1lXTtcbiAgICAgICAgbGV0IGNhbmNlbGVkID0gZmFsc2VcbiAgICAgICAgY29uc3QgY2FuY2VsID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUubG9nKFwidW5wYXRjaFwiLCBtZXRob2ROYW1lLCBcIm9mXCIsIGRpc3BsYXlOYW1lKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAvL3doYXRbbWV0aG9kTmFtZV0gPSBvcmlnTWV0aG9kO1xuICAgICAgICAgICAgY2FuY2VsZWQgPSB0cnVlIC8vIHRoaXMgYWxsb3cgdG8gbW9ua2V5cGF0Y2ggbW9yZSB0aGFuIG9uZSB0aW1lLlxuICAgICAgICB9O1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZihjYW5jZWxlZCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdNZXRob2QuY2FsbCh0aGlzLCAuLi5hcmd1bWVudHMpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIHRoaXNPYmplY3Q6IHRoaXMsXG4gICAgICAgICAgICAgICAgbWV0aG9kQXJndW1lbnRzOiBhcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgY2FuY2VsUGF0Y2g6IGNhbmNlbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbE1ldGhvZDogb3JpZ01ldGhvZCxcbiAgICAgICAgICAgICAgICBjYWxsT3JpZ2luYWxNZXRob2Q6ICgpID0+IGRhdGEucmV0dXJuVmFsdWUgPSBkYXRhLm9yaWdpbmFsTWV0aG9kLmFwcGx5KGRhdGEudGhpc09iamVjdCwgZGF0YS5tZXRob2RBcmd1bWVudHMpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGluc3RlYWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmV0ID0gVXRpbHMuc3VwcHJlc3NFcnJvcnMoaW5zdGVhZCwgXCJgaW5zdGVhZGAgY2FsbGJhY2sgb2YgXCIgKyB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lKShkYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAodGVtcFJldCAhPT0gdW5kZWZpbmVkKSBkYXRhLnJldHVyblZhbHVlID0gdGVtcFJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChiZWZvcmUpIFV0aWxzLnN1cHByZXNzRXJyb3JzKGJlZm9yZSwgXCJgYmVmb3JlYCBjYWxsYmFjayBvZiBcIiArIHdoYXRbbWV0aG9kTmFtZV0uZGlzcGxheU5hbWUpKGRhdGEpO1xuICAgICAgICAgICAgICAgIGRhdGEuY2FsbE9yaWdpbmFsTWV0aG9kKCk7XG4gICAgICAgICAgICAgICAgaWYgKGFmdGVyKSBVdGlscy5zdXBwcmVzc0Vycm9ycyhhZnRlciwgXCJgYWZ0ZXJgIGNhbGxiYWNrIG9mIFwiICsgd2hhdFttZXRob2ROYW1lXS5kaXNwbGF5TmFtZSkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25jZSkgY2FuY2VsKCk7XG4gICAgICAgICAgICByZXR1cm4gZGF0YS5yZXR1cm5WYWx1ZTtcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih3aGF0W21ldGhvZE5hbWVdLCBvcmlnTWV0aG9kKTtcbiAgICAgICAgd2hhdFttZXRob2ROYW1lXS5fX21vbmtleVBhdGNoZWQgPSB0cnVlO1xuICAgICAgICB3aGF0W21ldGhvZE5hbWVdLmRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7XG4gICAgICAgIGlmICghd2hhdFttZXRob2ROYW1lXS5fX29yaWdpbmFsTWV0aG9kKSB7XG4gICAgICAgICAgICB3aGF0W21ldGhvZE5hbWVdLl9fb3JpZ2luYWxNZXRob2QgPSBvcmlnTWV0aG9kO1xuICAgICAgICAgICAgd2hhdFttZXRob2ROYW1lXS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge3JldHVybiBvcmlnTWV0aG9kLnRvU3RyaW5nKCk7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2FuY2VsO1xuICAgIH1cblxuICAgIHN0YXRpYyBvblJlbW92ZWQobm9kZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG11dGF0aW9ucy5sZW5ndGg7IG0rKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG11dGF0aW9uID0gbXV0YXRpb25zW21dO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzID0gQXJyYXkuZnJvbShtdXRhdGlvbi5yZW1vdmVkTm9kZXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZihub2RlKSA+IC0xO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKG5vZGUpKTtcbiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7c3VidHJlZTogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGdldE5lc3RlZFByb3Aob2JqLCBwYXRoKSB7XG4gICAgICAgIHJldHVybiBwYXRoLnNwbGl0KC9cXHM/XFwuXFxzPy8pLnJlZHVjZShmdW5jdGlvbihvYmosIHByb3ApIHtcbiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3Byb3BdO1xuICAgICAgICB9LCBvYmopO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgc2hvd3MgYSB0b2FzdCBzaW1pbGFyIHRvIGFuZHJvaWQgdG93YXJkcyB0aGUgYm90dG9tIG9mIHRoZSBzY3JlZW4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudCBUaGUgc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvYXN0LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2JqZWN0LiBPcHRpb25hbCBwYXJhbWV0ZXIuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudHlwZSBDaGFuZ2VzIHRoZSB0eXBlIG9mIHRoZSB0b2FzdCBzdHlsaXN0aWNhbGx5IGFuZCBzZW1hbnRpY2FsbHkuIENob2ljZXM6IFwiXCIsIFwiaW5mb1wiLCBcInN1Y2Nlc3NcIiwgXCJkYW5nZXJcIi9cImVycm9yXCIsIFwid2FybmluZ1wiL1wid2FyblwiLiBEZWZhdWx0OiBcIlwiXG4gICAgICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmljb24gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBpY29uIHNob3VsZCBzaG93IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUuIEEgdG9hc3Qgd2l0aG91dCB0eXBlIHdpbGwgYWx3YXlzIGhhdmUgbm8gaWNvbi4gRGVmYXVsdDogdHJ1ZVxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvcHRpb25zLnRpbWVvdXQgQWRqdXN0cyB0aGUgdGltZSAoaW4gbXMpIHRoZSB0b2FzdCBzaG91bGQgYmUgc2hvd24gZm9yIGJlZm9yZSBkaXNhcHBlYXJpbmcgYXV0b21hdGljYWxseS4gRGVmYXVsdDogMzAwMFxuICAgICAqL1xuICAgIHN0YXRpYyBzaG93VG9hc3QoY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5iZC10b2FzdHNcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrcmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuc2lkZWJhciAmJiBlLmhhc05vdGljZSlbMF0uc2lkZWJhcikrXCIgKyBkaXZcIikgfHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZvcm0gPSBjb250YWluZXIgPyBjb250YWluZXIucXVlcnlTZWxlY3RvcihcImZvcm1cIikgOiBudWxsO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gZm9ybSA/IGZvcm0ub2Zmc2V0SGVpZ2h0IDogODA7XG4gICAgICAgICAgICBjb25zdCB0b2FzdFdyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgdG9hc3RXcmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJiZC10b2FzdHNcIik7XG4gICAgICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJib3R0b21cIiwgYm90dG9tK1wicHhcIik7XG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiI2FwcC1tb3VudFwiKS5hcHBlbmRDaGlsZCh0b2FzdFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvYXN0V3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYmQtdG9hc3RzXCIpXG4gICAgICAgIGNvbnN0IHt0eXBlID0gXCJcIiwgaWNvbiA9IHRydWUsIHRpbWVvdXQgPSAzMDAwfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IHRvYXN0RWxlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiYmQtdG9hc3RcIik7XG4gICAgICAgIGlmICh0eXBlKSB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcInRvYXN0LVwiICsgdHlwZSk7XG4gICAgICAgIGlmICh0eXBlICYmIGljb24pIHRvYXN0RWxlbS5jbGFzc0xpc3QuYWRkKFwiaWNvblwiKTtcbiAgICAgICAgdG9hc3RFbGVtLmlubmVyVGV4dCA9IGNvbnRlbnQ7XG4gICAgICAgIHRvYXN0V3JhcHBlci5hcHBlbmRDaGlsZCh0b2FzdEVsZW0pO1xuICAgICAgICB0b2FzdFdyYXBwZXIuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIGBjYWxjKDUwJSAtICR7dG9hc3RXcmFwcGVyLm9mZnNldFdpZHRoIC8gMn1weClgKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0b2FzdEVsZW0uY2xhc3NMaXN0LmFkZChcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0b2FzdEVsZW0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLmJkLXRvYXN0cyAuYmQtdG9hc3RcIikubGVuZ3RoKSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiLmJkLXRvYXN0c1wiKS5yZW1vdmUoKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cblxuICAgIHN0YXRpYyBhbGVydCh0aXRsZSwgY29udGVudCkge1xuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgJHttb2RhbE1vZHVsZS5tb2RhbH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtaW5uZXIgJHttb2RhbE1vZHVsZS5pbm5lcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciAke2hlYWRlck1vZHVsZS5oZWFkZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGl0bGVcIj4ke3RpdGxlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLW1vZGFsLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtjb250ZW50fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyICR7aGVhZGVyTW9kdWxlLmZvb3Rlcn0gJHtmb290ZXIyTW9kdWxlLmZvb3Rlcn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiPk9rYXk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCk7XG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuZm9vdGVyIGJ1dHRvblwiKS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgRE9NLmFkZENsYXNzKG1vZGFsLCBcImNsb3NpbmdcIik7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlKCk7IFxuICAgICAgICAgICAgICAgIGNsb3NpbmdMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIoKVxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IFxuICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgICBET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLmFwcGVuZChtb2RhbCk7XG4gICAgICAgIGNvbnN0IGNsb3NpbmdMaXN0ZW5lcnMgPSBbXVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgXG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLnJlbW92ZSgpOyBcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsb3NlOiAobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjbG9zaW5nTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgc2hvd0NvbnRlbnRFcnJvcnMoe3BsdWdpbnM6IHBsdWdpbkVycm9ycyA9IFtdLCB0aGVtZXM6IHRoZW1lRXJyb3JzID0gW119KSB7XG4gICAgICAgIGlmICghcGx1Z2luRXJyb3JzIHx8ICF0aGVtZUVycm9ycykgcmV0dXJuO1xuICAgICAgICBpZiAoIXBsdWdpbkVycm9ycy5sZW5ndGggJiYgIXRoZW1lRXJyb3JzLmxlbmd0aCkgcmV0dXJuO1xuICAgICAgICBsZXQgbW9kYWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tb2RhbCAmJiBlLmlubmVyICYmICFlLmhpZGVPbkZ1bGxzY3JlZW4pWzBdXG4gICAgICAgIGxldCBoZWFkZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oZWFkZXIgJiYgZS5yZXNwb25zaXZlV2lkdGhNb2JpbGUgJiYgZS5oaWRlT25GdWxsc2NyZWVuKVswXVxuICAgICAgICBsZXQgZm9vdGVyMk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmhlYWRlciAmJiBlLnJlc3BvbnNpdmVXaWR0aE1vYmlsZSAmJiBlLmZvY3VzTG9jaylbMF1cbiAgICAgICAgY29uc3QgbW9kYWwgPSBET00uY3JlYXRlRWxlbWVudChgPGRpdiBjbGFzcz1cImJkLW1vZGFsLXdyYXBwZXIgdGhlbWUtZGFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJkLWJhY2tkcm9wICR7QkRNb2R1bGVzLmdldChlID0+IGUuYmFja2Ryb3AgJiYgZS5iYWNrZHJvcFdpdGhMYXllcilbMF0uYmFja2Ryb3B9XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwgYmQtY29udGVudC1tb2RhbCAke21vZGFsTW9kdWxlLm1vZGFsfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiZC1tb2RhbC1pbm5lciAke21vZGFsTW9kdWxlLmlubmVyfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyICR7aGVhZGVyTW9kdWxlLmhlYWRlcn1cIj48ZGl2IGNsYXNzPVwidGl0bGVcIj5Db250ZW50IEVycm9yczwvZGl2PjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmQtbW9kYWwtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYi1iYXIgVE9QXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5QbHVnaW5zPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItYmFyLWl0ZW1cIj5UaGVtZXM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj5OYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tbWVzc2FnZVwiPk1lc3NhZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtY29sdW1uIGNvbHVtbi1lcnJvclwiPkVycm9yPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzY3JvbGxlci13cmFwIGZhZGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Nyb2xsZXJcIj5cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvb3RlciAke2hlYWRlck1vZHVsZS5mb290ZXJ9ICR7Zm9vdGVyMk1vZHVsZS5mb290ZXJ9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIj5Pa2F5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgIFxuICAgICAgICBmdW5jdGlvbiBnZW5lcmF0ZVRhYihlcnJvcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JzXCI+YCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVyciBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IERPTS5jcmVhdGVFbGVtZW50KGA8ZGl2IGNsYXNzPVwiZXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW5hbWVcIj4ke2Vyci5uYW1lID8gZXJyLm5hbWUgOiBlcnIuZmlsZX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb2x1bW4gY29sdW1uLW1lc3NhZ2VcIj4ke2Vyci5tZXNzYWdlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWNvbHVtbiBjb2x1bW4tZXJyb3JcIj48YSBjbGFzcz1cImVycm9yLWxpbmtcIiBocmVmPVwiXCI+JHtlcnIuZXJyb3IgPyBlcnIuZXJyb3IubWVzc2FnZSA6IFwiXCJ9PC9hPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kKGVycm9yKTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLnF1ZXJ5U2VsZWN0b3JBbGwoXCJhXCIpLmZvckVhY2goZWwgPT4gZWwuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5lcnIoXCJDb250ZW50TWFuYWdlclwiLCBgRXJyb3IgZGV0YWlscyBmb3IgJHtlcnIubmFtZSA/IGVyci5uYW1lIDogZXJyLmZpbGV9LmAsIGVyci5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyO1xuICAgICAgICB9XG4gICAgXG4gICAgICAgIGNvbnN0IHRhYnMgPSBbZ2VuZXJhdGVUYWIocGx1Z2luRXJyb3JzKSwgZ2VuZXJhdGVUYWIodGhlbWVFcnJvcnMpXTtcbiAgICBcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbChcIi50YWItYmFyLWl0ZW1cIikuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW0uc2VsZWN0ZWRcIik7XG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWQpIERPTS5yZW1vdmVDbGFzcyhzZWxlY3RlZCwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhlLnRhcmdldCwgXCJzZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGVyID0gbW9kYWwucXVlcnlTZWxlY3RvcihcIi5zY3JvbGxlclwiKTtcbiAgICAgICAgICAgIHNjcm9sbGVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgICAgICBzY3JvbGxlci5hcHBlbmQodGFic1tET00uaW5kZXgoZS50YXJnZXQpXSk7XG4gICAgICAgIH0pKTtcbiAgICBcbiAgICAgICAgbW9kYWwucXVlcnlTZWxlY3RvcihcIi5mb290ZXIgYnV0dG9uXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgICAgICBET00uYWRkQ2xhc3MobW9kYWwsIFwiY2xvc2luZ1wiKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBtb2RhbC5yZW1vdmUoKTsgfSwgMzAwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3IoXCIuYmQtYmFja2Ryb3BcIikuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIERPTS5hZGRDbGFzcyhtb2RhbCwgXCJjbG9zaW5nXCIpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IG1vZGFsLnJlbW92ZSgpOyB9LCAzMDApO1xuICAgICAgICB9KTtcbiAgICAgICAgRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKS5hcHBlbmQobW9kYWwpO1xuICAgICAgICBpZiAocGx1Z2luRXJyb3JzLmxlbmd0aCkgbW9kYWwucXVlcnlTZWxlY3RvcihcIi50YWItYmFyLWl0ZW1cIikuY2xpY2soKTtcbiAgICAgICAgZWxzZSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRhYi1iYXItaXRlbVwiKVsxXS5jbGljaygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBzaG93Q2hhbmdlbG9nTW9kYWwob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IE1vZGFsU3RhY2sgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcInB1c2hcIiwgXCJ1cGRhdGVcIiwgXCJwb3BcIiwgXCJwb3BXaXRoS2V5XCIpO1xuICAgICAgICBjb25zdCBDaGFuZ2Vsb2dDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJmaXhlZFwiLCBcImltcHJvdmVkXCIpO1xuICAgICAgICBjb25zdCBUZXh0RWxlbWVudCA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVGV4dFwiKTtcbiAgICAgICAgY29uc3QgRmxleENoaWxkID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJDaGlsZFwiKTtcbiAgICAgICAgY29uc3QgVGl0bGVzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJUYWdzXCIsIFwiZGVmYXVsdFwiKTtcbiAgICAgICAgY29uc3QgQ2hhbmdlbG9nID0gV2VicGFja01vZHVsZXMuZmluZChtID0+IG0uZGVmYXVsdFByb3BzICYmIG0uZGVmYXVsdFByb3BzLnNlbGVjdGFibGUgPT0gZmFsc2UpO1xuICAgICAgICBjb25zdCBNYXJrZG93blBhcnNlciA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiZGVmYXVsdFJ1bGVzXCIsIFwicGFyc2VcIik7XG4gICAgICAgIGlmICghQ2hhbmdlbG9nIHx8ICFNb2RhbFN0YWNrIHx8ICFDaGFuZ2Vsb2dDbGFzc2VzIHx8ICFUZXh0RWxlbWVudCB8fCAhRmxleENoaWxkIHx8ICFUaXRsZXMgfHwgIU1hcmtkb3duUGFyc2VyKSByZXR1cm47XG4gICAgXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGltYWdlID0gXCJodHRwczovL3JlcG9zaXRvcnktaW1hZ2VzLmdpdGh1YnVzZXJjb250ZW50LmNvbS8xMDU0NzM1MzcvOTU3YjU0ODAtN2MyNi0xMWU5LTg0MDEtNTBmYTgyMGNiYWU1XCIsIFxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBcIlwiLCBcbiAgICAgICAgICAgIGNoYW5nZXMgPSBbXSwgXG4gICAgICAgICAgICB0aXRsZSA9IFwiQmFuZGFnZWRCRFwiLCBcbiAgICAgICAgICAgIHN1YnRpdGxlID0gYHYke2JiZFZlcnNpb259YCwgXG4gICAgICAgICAgICBmb290ZXJcbiAgICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICAgIGNvbnN0IGNlID0gQkRWMi5SZWFjdC5jcmVhdGVFbGVtZW50O1xuICAgICAgICBjb25zdCBjaGFuZ2Vsb2dJdGVtcyA9IFtjZShcImltZ1wiLCB7c3JjOiBpbWFnZX0pXTtcbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uKSBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGNlKFwicFwiLCBudWxsLCBNYXJrZG93blBhcnNlci5wYXJzZShkZXNjcmlwdGlvbikpKTtcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBjaGFuZ2VzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICBjb25zdCBlbnRyeSA9IGNoYW5nZXNbY107XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gQ2hhbmdlbG9nQ2xhc3Nlc1tlbnRyeS50eXBlXSA/IENoYW5nZWxvZ0NsYXNzZXNbZW50cnkudHlwZV0gOiBDaGFuZ2Vsb2dDbGFzc2VzLmFkZGVkO1xuICAgICAgICAgICAgY29uc3QgbWFyZ2luID0gYyA9PSAwID8gQ2hhbmdlbG9nQ2xhc3Nlcy5tYXJnaW5Ub3AgOiBcIlwiO1xuICAgICAgICAgICAgY2hhbmdlbG9nSXRlbXMucHVzaChjZShcImgxXCIsIHtjbGFzc05hbWU6IGAke3R5cGV9ICR7bWFyZ2lufWAsfSwgZW50cnkudGl0bGUpKTtcbiAgICAgICAgICAgIGNvbnN0IGxpc3QgPSBjZShcInVsXCIsIG51bGwsIGVudHJ5Lml0ZW1zLm1hcChpID0+IGNlKFwibGlcIiwgbnVsbCwgTWFya2Rvd25QYXJzZXIucGFyc2UoaSkpKSk7XG4gICAgICAgICAgICBjaGFuZ2Vsb2dJdGVtcy5wdXNoKGxpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbmRlckhlYWRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlKEZsZXhDaGlsZC5DaGlsZCwge2dyb3c6IDEsIHNocmluazogMX0sXG4gICAgICAgICAgICAgICAgY2UoVGl0bGVzLmRlZmF1bHQsIHt0YWc6IFRpdGxlcy5UYWdzLkg0fSwgdGl0bGUpLFxuICAgICAgICAgICAgICAgIGNlKFRleHRFbGVtZW50LHtzaXplOiBUZXh0RWxlbWVudC5TaXplcy5TTUFMTCwgY29sb3I6IFRleHRFbGVtZW50LkNvbG9ycy5TVEFOREFSRCwgY2xhc3NOYW1lOiBDaGFuZ2Vsb2dDbGFzc2VzLmRhdGV9LCBzdWJ0aXRsZSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgXG4gICAgICAgIGNvbnN0IHJlbmRlckZvb3RlciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IEFuY2hvciA9IFdlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRpc3BsYXlOYW1lID09IFwiQW5jaG9yXCIpO1xuICAgICAgICAgICAgY29uc3QgQW5jaG9yQ2xhc3NlcyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiKSB8fCB7YW5jaG9yOiBcImFuY2hvci0zWi04QmJcIiwgYW5jaG9yVW5kZXJsaW5lT25Ib3ZlcjogXCJhbmNob3JVbmRlcmxpbmVPbkhvdmVyLTJFU0hRQlwifTtcbiAgICAgICAgICAgIGNvbnN0IGpvaW5TdXBwb3J0U2VydmVyID0gKGNsaWNrKSA9PiB7XG4gICAgICAgICAgICAgICAgY2xpY2sucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjbGljay5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBNb2RhbFN0YWNrLnBvcCgpO1xuICAgICAgICAgICAgICAgIEJEVjIuam9pbkJEMigpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnN0IHN1cHBvcnRMaW5rID0gQW5jaG9yID8gY2UoQW5jaG9yLCB7b25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKSA6IGNlKFwiYVwiLCB7Y2xhc3NOYW1lOiBgJHtBbmNob3JDbGFzc2VzLmFuY2hvcn0gJHtBbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YCwgb25DbGljazogam9pblN1cHBvcnRTZXJ2ZXJ9LCBcIkpvaW4gb3VyIERpc2NvcmQgU2VydmVyLlwiKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRGb290ZXIgPSBjZShUZXh0RWxlbWVudCx7c2l6ZTogVGV4dEVsZW1lbnQuU2l6ZXMuU01BTEwsIGNvbG9yOiBUZXh0RWxlbWVudC5Db2xvcnMuU1RBTkRBUkR9LCBcIk5lZWQgc3VwcG9ydD8gXCIsIHN1cHBvcnRMaW5rKTtcbiAgICAgICAgICAgIHJldHVybiBjZShGbGV4Q2hpbGQuQ2hpbGQsIHtncm93OiAxLCBzaHJpbms6IDF9LCBmb290ZXIgPyBmb290ZXIgOiBkZWZhdWx0Rm9vdGVyKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gTW9kYWxTdGFjay5wdXNoKGZ1bmN0aW9uKHByb3BzKSB7XG4gICAgICAgICAgICByZXR1cm4gY2UoQ2hhbmdlbG9nLCBPYmplY3QuYXNzaWduKHtcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IENoYW5nZWxvZ0NsYXNzZXMuY29udGFpbmVyLFxuICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgb25TY3JvbGw6IF8gPT4gXyxcbiAgICAgICAgICAgICAgICBvbkNsb3NlOiBfID0+IF8sXG4gICAgICAgICAgICAgICAgcmVuZGVySGVhZGVyOiByZW5kZXJIZWFkZXIsXG4gICAgICAgICAgICAgICAgcmVuZGVyRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGNoYW5nZWxvZ0l0ZW1zXG4gICAgICAgICAgICB9LCBwcm9wcykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBhIGdlbmVyaWMgYnV0IHZlcnkgY3VzdG9taXphYmxlIGNvbmZpcm1hdGlvbiBtb2RhbCB3aXRoIG9wdGlvbmFsIGNvbmZpcm0gYW5kIGNhbmNlbCBjYWxsYmFja3MuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHRpdGxlIC0gdGl0bGUgb2YgdGhlIG1vZGFsXG4gICAgICogQHBhcmFtIHsoc3RyaW5nfFJlYWN0RWxlbWVudHxBcnJheTxzdHJpbmd8UmVhY3RFbGVtZW50Pil9IGNoaWxkcmVuIC0gYSBzaW5nbGUgb3IgbWl4ZWQgYXJyYXkgb2YgcmVhY3QgZWxlbWVudHMgYW5kIHN0cmluZ3MuIEV2ZXJ5IHN0cmluZyBpcyB3cmFwcGVkIGluIERpc2NvcmQncyBgTWFya2Rvd25gIGNvbXBvbmVudCBzbyBzdHJpbmdzIHdpbGwgc2hvdyBhbmQgcmVuZGVyIHByb3Blcmx5LlxuICAgICAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc10gLSBvcHRpb25zIHRvIG1vZGlmeSB0aGUgbW9kYWxcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmRhbmdlcj1mYWxzZV0gLSB3aGV0aGVyIHRoZSBtYWluIGJ1dHRvbiBzaG91bGQgYmUgcmVkIG9yIG5vdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jb25maXJtVGV4dD1Pa2F5XSAtIHRleHQgZm9yIHRoZSBjb25maXJtYXRpb24vc3VibWl0IGJ1dHRvblxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5jYW5jZWxUZXh0PUNhbmNlbF0gLSB0ZXh0IGZvciB0aGUgY2FuY2VsIGJ1dHRvblxuICAgICAqIEBwYXJhbSB7Y2FsbGFibGV9IFtvcHRpb25zLm9uQ29uZmlybT1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIHN1Ym1pdCBidXR0b25cbiAgICAgKiBAcGFyYW0ge2NhbGxhYmxlfSBbb3B0aW9ucy5vbkNhbmNlbD1OT09QXSAtIGNhbGxiYWNrIHRvIG9jY3VyIHdoZW4gY2xpY2tpbmcgdGhlIGNhbmNlbCBidXR0b25cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMua2V5XSAtIGtleSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBtb2RhbC4gSWYgbm90IHByb3ZpZGVkLCBvbmUgaXMgZ2VuZXJhdGVkIGFuZCByZXR1cm5lZFxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gdGhlIGtleSB1c2VkIGZvciB0aGlzIG1vZGFsXG4gICAgICovXG4gICAgc3RhdGljIHNob3dDb25maXJtYXRpb25Nb2RhbCh0aXRsZSwgY29udGVudCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IE1vZGFsQWN0aW9ucyA9IFdlYnBhY2tNb2R1bGVzLmZpbmRCeVByb3BzKFwib3Blbk1vZGFsXCIsIFwidXBkYXRlTW9kYWxcIik7XG4gICAgICAgIGNvbnN0IE1hcmtkb3duID0gV2VicGFja01vZHVsZXMuZmluZEJ5RGlzcGxheU5hbWUoXCJNYXJrZG93blwiKTtcbiAgICAgICAgY29uc3QgQ29uZmlybWF0aW9uTW9kYWwgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIkNvbmZpcm1Nb2RhbFwiKTtcbiAgICAgICAgaWYgKCFNb2RhbEFjdGlvbnMgfHwgIUNvbmZpcm1hdGlvbk1vZGFsIHx8ICFNYXJrZG93bikgcmV0dXJuIFV0aWxzLmFsZXJ0KHRpdGxlLCBjb250ZW50KTtcblxuICAgICAgICBjb25zdCBlbXB0eUZ1bmN0aW9uID0gKCkgPT4ge307XG4gICAgICAgIGNvbnN0IHtvbkNvbmZpcm0gPSBlbXB0eUZ1bmN0aW9uLCBvbkNhbmNlbCA9IGVtcHR5RnVuY3Rpb24sIGNvbmZpcm1UZXh0ID0gXCJPa2F5XCIsIGNhbmNlbFRleHQgPSBcIkNhbmNlbFwiLCBkYW5nZXIgPSBmYWxzZSwga2V5ID0gdW5kZWZpbmVkfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSBjb250ZW50ID0gW2NvbnRlbnRdO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5tYXAoYyA9PiB0eXBlb2YoYykgPT09IFwic3RyaW5nXCIgPyBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFya2Rvd24sIG51bGwsIGMpIDogYyk7XG4gICAgICAgIHJldHVybiBNb2RhbEFjdGlvbnMub3Blbk1vZGFsKHByb3BzID0+IHtcbiAgICAgICAgICAgIHJldHVybiBCRFYyLlJlYWN0LmNyZWF0ZUVsZW1lbnQoQ29uZmlybWF0aW9uTW9kYWwsIE9iamVjdC5hc3NpZ24oe1xuICAgICAgICAgICAgICAgIGhlYWRlcjogdGl0bGUsXG4gICAgICAgICAgICAgICAgcmVkOiBkYW5nZXIsXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IGNvbmZpcm1UZXh0LFxuICAgICAgICAgICAgICAgIGNhbmNlbFRleHQ6IGNhbmNlbFRleHQsXG4gICAgICAgICAgICAgICAgb25Db25maXJtOiBvbkNvbmZpcm0sXG4gICAgICAgICAgICAgICAgb25DYW5jZWw6IG9uQ2FuY2VsXG4gICAgICAgICAgICB9LCBwcm9wcyksIGNvbnRlbnQpO1xuICAgICAgICB9LCB7bW9kYWxLZXk6IGtleX0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBnZXQgcmVtb3ZlRGEoKXtcbiAgICAgICAgcmV0dXJuIHJlbW92ZURhXG4gICAgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVEYShjbGFzc05hbWUpe1xuICAgIGlmKCFjbGFzc05hbWUpcmV0dXJuIGNsYXNzTmFtZVxuICAgIHJldHVybiBjbGFzc05hbWUuc3BsaXQoXCIgXCIpLmZpbHRlcihlID0+ICFlLnN0YXJ0c1dpdGgoXCJkYS1cIikpLmpvaW4oXCIgXCIpXG59XG5cblV0aWxzLnNob3dUb2FzdCA9IFV0aWxzLnN1cHByZXNzRXJyb3JzKFV0aWxzLnNob3dUb2FzdCwgXCJDb3VsZCBub3Qgc2hvdyB0b2FzdC5cIik7XG5cbndpbmRvdy5MaWdodGNvcmQuQmV0dGVyRGlzY29yZC5VdGlscyA9IFV0aWxzIiwiaW1wb3J0IHtzZXR0aW5nc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCB0aGVtZU1vZHVsZSBmcm9tIFwiLi90aGVtZU1vZHVsZVwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFYyIHtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICB0aGlzLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5XZWJwYWNrTW9kdWxlcyA9ICgoKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbiAgICAgICAgICAgIGRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcblxyXG4gICAgICAgICAgICBjb25zdCBzaG91bGRQcm90ZWN0ID0gdGhlTW9kdWxlID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUucmVtb3ZlICYmIHRoZU1vZHVsZS5zZXQgJiYgdGhlTW9kdWxlLmNsZWFyICYmIHRoZU1vZHVsZS5nZXQgJiYgIXRoZU1vZHVsZS5zb3J0KSByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGlmICh0aGVNb2R1bGUuZ2V0VG9rZW4gfHwgdGhlTW9kdWxlLmdldEVtYWlsIHx8IHRoZU1vZHVsZS5zaG93VG9rZW4pIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgcHJvdGVjdCA9ICh0aGVNb2R1bGUsIGlzRGVmYXVsdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG1vZCA9ICFpc0RlZmF1bHQgPyB0aGVNb2R1bGUuZGVmYXVsdCA6IHRoZU1vZHVsZVxyXG4gICAgICAgICAgICAgICAgaWYoIW1vZClyZXR1cm4gdGhlTW9kdWxlXHJcbiAgICAgICAgICAgICAgICBpZiAobW9kLnJlbW92ZSAmJiBtb2Quc2V0ICYmIG1vZC5jbGVhciAmJiBtb2QuZ2V0ICYmICFtb2Quc29ydCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1vZC5nZXRUb2tlbiAmJiAhbW9kLmdldEVtYWlsICYmICFtb2Quc2hvd1Rva2VuKXJldHVybiB0aGVNb2R1bGVcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCBwcm94eSA9IG5ldyBQcm94eShtb2QsIHtcclxuICAgICAgICAgICAgICAgICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uKG9iaiwgcHJvcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PT0gXCJnZXRUb2tlblwiIHx8IHByb3AgPT09IFwiZ2V0RW1haWxcIiB8fCBwcm9wID09PSBcInNob3dUb2tlblwiKSByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbihvYmosIGZ1bmMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJnZXRUb2tlblwiICYmIG9iai5nZXRUb2tlbikgcmV0dXJuICgpID0+IFwibWZhLlhDbmJLem8wQ0xJcWRKekJuTDBEOFBmRHJ1cWtKTkhqd0hYdHIzOVVVM0Y4aEh4NDNqb2pJU3lpNWpkak81MmU5X2U5TWptYWZaRkZwYy1zZU9NYVwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYyA9PSBcImdldEVtYWlsXCIgJiYgb2JqLmdldEVtYWlsKSByZXR1cm4gKCkgPT4gXCJwdXBwZXQxMTExMkBnbWFpbC5jb21cIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJzaG93VG9rZW5cIiAmJiBvYmouc2hvd1Rva2VuKSByZXR1cm4gKCkgPT4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZ1bmMgPT0gXCJfX3Byb3RvX19cIiAmJiBvYmouX19wcm90b19fKSByZXR1cm4gcHJveHk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqW2Z1bmNdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmKCFpc0RlZmF1bHQpe1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGVNb2R1bGUsIHtkZWZhdWx0OiBwcm94eX0pXHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5O1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgZmluZCA9IChmaWx0ZXIpID0+IHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByZXEuYykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXEuYy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gcmVxLmNbaV0uZXhwb3J0cztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgbS5fX2VzTW9kdWxlICYmIG0uZGVmYXVsdCAmJiBmaWx0ZXIobS5kZWZhdWx0KSkgcmV0dXJuIHByb3RlY3QobS5kZWZhdWx0LCB0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG0gJiYgZmlsdGVyKG0pKVx0cmV0dXJuIHByb3RlY3QobSwgZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChwcm90ZWN0KG0uZGVmYXVsdCwgdHJ1ZSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKHByb3RlY3QobSwgZmFsc2UpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlcztcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGZpbmRCeVVuaXF1ZVByb3BlcnRpZXMgPSAocHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG4gICAgICAgICAgICBjb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKHByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuICAgICAgICAgICAgY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHtmaW5kLCBmaW5kQWxsLCBmaW5kQnlVbmlxdWVQcm9wZXJ0aWVzLCBmaW5kQnlQcm90b3R5cGVzLCBmaW5kQnlEaXNwbGF5TmFtZX07XHJcbiAgICAgICAgfSkoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pbnRlcm5hbCA9IHtcclxuICAgICAgICAgICAgcmVhY3Q6IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJDb21wb25lbnRcIiwgXCJQdXJlQ29tcG9uZW50XCIsIFwiQ2hpbGRyZW5cIiwgXCJjcmVhdGVFbGVtZW50XCIsIFwiY2xvbmVFbGVtZW50XCJdKSxcclxuICAgICAgICAgICAgcmVhY3REb206IHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJmaW5kRE9NTm9kZVwiXSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZ2V0SW50ZXJuYWxJbnN0YW5jZSA9IGUgPT4gZVtPYmplY3Qua2V5cyhlKS5maW5kKGsgPT4gay5zdGFydHNXaXRoKFwiX19yZWFjdEludGVybmFsSW5zdGFuY2VcIikpXTtcclxuICAgICAgICB3aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuVjIgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgaW5pdGlhbGl6ZSgpIHtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgam9pbkJEMSgpIHt0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlQW5kVHJhbnNpdGlvblRvSW52aXRlQ2hhbm5lbChcIjBUbWZvNVpiT1JDUnFiQWRcIik7fVxyXG4gICAgbGVhdmVCRDEoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIpO31cclxuXHJcbiAgICBqb2luQkQyKCkge3RoaXMuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKFwiMkhTY204alwiKTt9XHJcbiAgICBsZWF2ZUJEMigpIHt0aGlzLkd1aWxkQWN0aW9ucy5sZWF2ZUd1aWxkKFwiMjgwODA2NDcyOTI4MTk4NjU2XCIpO31cclxuXHJcbiAgICBqb2luTEMoKSB7dGhpcy5JbnZpdGVBY3Rpb25zLmFjY2VwdEludml0ZUFuZFRyYW5zaXRpb25Ub0ludml0ZUNoYW5uZWwoXCI3ZUZmZjJBXCIpO31cclxuICAgIGxlYXZlTEMoKSB7dGhpcy5HdWlsZEFjdGlvbnMubGVhdmVHdWlsZChcIjcwNTkwODM1MDIxODY2NjExN1wiKTt9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIFJlYWN0fVxyXG4gICAgICovXHJcbiAgICBnZXQgUmVhY3QoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3Q7fVxyXG4gICAgLyoqXHJcbiAgICAgKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0LWRvbVwiKX1cclxuICAgICAqL1xyXG4gICAgZ2V0IHJlYWN0RG9tKCkge3JldHVybiB0aGlzLmludGVybmFsLnJlYWN0RG9tO31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBpbXBvcnQoXCJyZWFjdC1kb21cIil9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdERvbSgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdERvbTt9XHJcbiAgICAvKipcclxuICAgICAqIEB0eXBlIHt0eXBlb2YgUmVhY3QuQ29tcG9uZW50fVxyXG4gICAgICovXHJcbiAgICBnZXQgcmVhY3RDb21wb25lbnQoKSB7cmV0dXJuIHRoaXMuaW50ZXJuYWwucmVhY3QuQ29tcG9uZW50O31cclxuICAgIC8qKlxyXG4gICAgICogQHR5cGUge3R5cGVvZiBSZWFjdC5Db21wb25lbnR9XHJcbiAgICAgKi9cclxuICAgIGdldCBSZWFjdENvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5pbnRlcm5hbC5yZWFjdC5Db21wb25lbnQ7fVxyXG5cclxuICAgIGdldCBhbmNob3JDbGFzc2VzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYW5jaG9yVW5kZXJsaW5lT25Ib3ZlclwiXSkgfHwge2FuY2hvcjogXCJhbmNob3ItM1otOEJiXCIsIGFuY2hvclVuZGVybGluZU9uSG92ZXI6IFwiYW5jaG9yVW5kZXJsaW5lT25Ib3Zlci0yRVNIUUJcIn07fVxyXG4gICAgZ2V0IHNsYXRlRWRpdG9yQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInNsYXRlVGV4dEFyZWFcIl0pO31cclxuICAgIGdldCBtZXNzYWdlQ2xhc3NlcygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcIm1lc3NhZ2VcIiwgXCJjb250YWluZXJDb3p5XCJdKTt9XHJcbiAgICBnZXQgZ3VpbGRDbGFzc2VzKCkge1xyXG5cdFx0Y29uc3QgZ3VpbGRzV3JhcHBlciA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLndyYXBwZXIgJiYgZS51bnJlYWRNZW50aW9uc0JhcilbMF07XHJcbiAgICAgICAgY29uc3QgZ3VpbGRzID0gQkRNb2R1bGVzLmdldChlID0+IGUuZ3VpbGRzRXJyb3IgJiYgZS5zZWxlY3RlZClbMF1cclxuICAgICAgICBjb25zdCBwaWxsID0gQkRNb2R1bGVzLmdldChlID0+IGUuYmxvYkNvbnRhaW5lcilbMF1cclxuICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZ3VpbGRzV3JhcHBlciwgZ3VpbGRzLCBwaWxsKTtcclxuXHR9XHJcblxyXG4gICAgZ2V0IE1lc3NhZ2VDb250ZW50Q29tcG9uZW50KCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmRlZmF1bHRQcm9wcyAmJiBtLmRlZmF1bHRQcm9wcy5oYXNPd25Qcm9wZXJ0eShcImRpc2FibGVCdXR0b25zXCIpKTt9XHJcbiAgICBnZXQgTWVzc2FnZUNvbXBvbmVudCgpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS5kZWZhdWx0ICYmIG0uZGVmYXVsdC5kaXNwbGF5TmFtZSAmJiBtLmRlZmF1bHQuZGlzcGxheU5hbWUgPT0gXCJNZXNzYWdlXCIpO31cclxuICAgIGdldCBUaW1lRm9ybWF0dGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZGF0ZUZvcm1hdFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBXcmFwcGVyKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeURpc3BsYXlOYW1lKFwiVG9vbHRpcFwiKTt9XHJcbiAgICBnZXQgTmF0aXZlTW9kdWxlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wic2V0QmFkZ2VcIl0pO31cclxuICAgIGdldCBJbnZpdGVBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTt9XHJcbiAgICBnZXQgR3VpbGRBY3Rpb25zKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wibGVhdmVHdWlsZFwiXSk7fVxyXG4gICAgZ2V0IFRvb2x0aXBzKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmQobSA9PiBtLmhpZGUgJiYgbS5zaG93ICYmICFtLnNlYXJjaCAmJiAhbS5zdWJtaXQgJiYgIW0uc2VhcmNoICYmICFtLmFjdGl2YXRlUmFnaW5nRGVtb24gJiYgIW0uZGlzbWlzcyk7fVxyXG4gICAgZ2V0IEtleUdlbmVyYXRvcigpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kKG0gPT4gbS50b1N0cmluZyAmJiAvXCJiaW5hcnlcIi8udGVzdChtLnRvU3RyaW5nKCkpKTt9XHJcbiAgICBnZXQgTGF5ZXJTdGFjaygpIHtyZXR1cm4gdGhpcy5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcInBvcExheWVyXCJdKTt9XHJcbiAgICBnZXQgVXNlclN0b3JlKCkge3JldHVybiB0aGlzLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0Q3VycmVudFVzZXJcIl0pO31cclxuICAgIGdldCBDaGFubmVsU3RvcmUoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRDaGFubmVsXCJdKTt9XHJcbiAgICBnZXQgQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJvcGVuUHJpdmF0ZUNoYW5uZWxcIl0pO31cclxuICAgIGdldCBQcml2YXRlQ2hhbm5lbEFjdGlvbnMoKSB7cmV0dXJuIHRoaXMuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJzZWxlY3RQcml2YXRlQ2hhbm5lbFwiXSk7fVxyXG5cclxuICAgIG9wZW5ETSh1c2VySWQpIHtcclxuICAgICAgICBjb25zdCBzZWxmSWQgPSB0aGlzLlVzZXJTdG9yZS5nZXRDdXJyZW50VXNlcigpLmlkO1xyXG4gICAgICAgIGlmIChzZWxmSWQgPT0gdXNlcklkKSByZXR1cm47XHJcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNoYW5uZWxJZCA9IHRoaXMuQ2hhbm5lbFN0b3JlLmdldERNRnJvbVVzZXJJZCh1c2VySWQpO1xyXG4gICAgICAgIGlmIChwcml2YXRlQ2hhbm5lbElkKSByZXR1cm4gdGhpcy5Qcml2YXRlQ2hhbm5lbEFjdGlvbnMuc2VsZWN0UHJpdmF0ZUNoYW5uZWwocHJpdmF0ZUNoYW5uZWxJZCk7XHJcbiAgICAgICAgdGhpcy5DaGFubmVsQWN0aW9ucy5vcGVuUHJpdmF0ZUNoYW5uZWwoc2VsZklkLCB1c2VySWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHBhcnNlU2V0dGluZ3MoY2F0KSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldHRpbmdzKS5yZWR1Y2UoKGFyciwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmcgPSBzZXR0aW5nc1trZXldO1xyXG4gICAgICAgICAgICBpZiAoc2V0dGluZy5jYXQgPT09IGNhdCAmJiBzZXR0aW5nLmltcGxlbWVudGVkICYmICFzZXR0aW5nLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgc2V0dGluZy50ZXh0ID0ga2V5O1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2V0dGluZyk7XHJcbiAgICAgICAgICAgIH0gcmV0dXJuIGFycjtcclxuICAgICAgICB9LCBbXSk7XHJcbiAgICB9XHJcblxyXG59OyIsImltcG9ydCBET00gZnJvbSBcIi4vZG9tdG9vbHNcIjtcclxuXHJcbmNvbnN0IHN0eWxlID0gYFxyXG4gICAgLmNvbnRhaW5lci0yUmwwMXUge1xyXG4gICAgICAgIGRpc3BsYXk6IG5vbmUhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5cclxuICAgIC5jaGF0LTNiUnh4dSB7XHJcbiAgICAgICAgZGlzcGxheTogbm9uZSFpbXBvcnRhbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLnNpZGViYXItMks4cEZoIHtcclxuICAgICAgICBmbGV4LWdyb3c6IDEhaW1wb3J0YW50O1xyXG4gICAgfVxyXG5gO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgbmV3IGNsYXNzIFZvaWNlTW9kZSB7XHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJWb2ljZU1vZGVcIiwgc3R5bGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3AoKSB7XHJcbiAgICAgICAgRE9NLnJlbW92ZVN0eWxlKFwiVm9pY2VNb2RlXCIpO1xyXG4gICAgfVxyXG59OyIsImNvbnN0IHJlcSA9IHdlYnBhY2tKc29ucC5wdXNoKFtbXSwge19fZXh0cmFfaWRfXzogKG1vZHVsZSwgZXhwb3J0cywgcmVxKSA9PiBtb2R1bGUuZXhwb3J0cyA9IHJlcX0sIFtbXCJfX2V4dHJhX2lkX19cIl1dXSk7XHJcbmRlbGV0ZSByZXEubS5fX2V4dHJhX2lkX187XHJcbmRlbGV0ZSByZXEuYy5fX2V4dHJhX2lkX187XHJcbmNvbnN0IGZpbmQgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIHJldHVybiBtLmRlZmF1bHQ7XHJcbiAgICAgICAgICAgIGlmIChtICYmIGZpbHRlcihtKSlcdHJldHVybiBtO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUud2FybihcIkNhbm5vdCBmaW5kIGxvYWRlZCBtb2R1bGUgaW4gY2FjaGVcIik7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGZpbmRBbGwgPSAoZmlsdGVyKSA9PiB7XHJcbiAgICBjb25zdCBtb2R1bGVzID0gW107XHJcbiAgICBmb3IgKGNvbnN0IGkgaW4gcmVxLmMpIHtcclxuICAgICAgICBpZiAocmVxLmMuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbSA9IHJlcS5jW2ldLmV4cG9ydHM7XHJcbiAgICAgICAgICAgIGlmIChtICYmIG0uX19lc01vZHVsZSAmJiBtLmRlZmF1bHQgJiYgZmlsdGVyKG0uZGVmYXVsdCkpIG1vZHVsZXMucHVzaChtLmRlZmF1bHQpO1xyXG4gICAgICAgICAgICBlbHNlIGlmIChtICYmIGZpbHRlcihtKSkgbW9kdWxlcy5wdXNoKG0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBtb2R1bGVzO1xyXG59O1xyXG5cclxuY29uc3QgZmluZEJ5UHJvcHMgPSAoLi4ucHJvcE5hbWVzKSA9PiBmaW5kKG1vZHVsZSA9PiBwcm9wTmFtZXMuZXZlcnkocHJvcCA9PiBtb2R1bGVbcHJvcF0gIT09IHVuZGVmaW5lZCkpO1xyXG5jb25zdCBmaW5kQnlQcm90b3R5cGVzID0gKC4uLnByb3RvTmFtZXMpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5wcm90b3R5cGUgJiYgcHJvdG9OYW1lcy5ldmVyeShwcm90b1Byb3AgPT4gbW9kdWxlLnByb3RvdHlwZVtwcm90b1Byb3BdICE9PSB1bmRlZmluZWQpKTtcclxuY29uc3QgZmluZEJ5RGlzcGxheU5hbWUgPSAoZGlzcGxheU5hbWUpID0+IGZpbmQobW9kdWxlID0+IG1vZHVsZS5kaXNwbGF5TmFtZSA9PT0gZGlzcGxheU5hbWUpO1xyXG5cclxubGV0IG1vZCA9ICB7ZmluZCwgZmluZEFsbCwgZmluZEJ5UHJvcHMsIGZpbmRCeVByb3RvdHlwZXMsIGZpbmRCeURpc3BsYXlOYW1lfTtcclxuZXhwb3J0IGRlZmF1bHQgbW9kXHJcblxyXG53aW5kb3cuTGlnaHRjb3JkLkJldHRlckRpc2NvcmQuV2VicGFja01vZHVsZXMgPSBtb2QiLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBCdWdIdW50ZXJCYWRnZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMucHJvcHNcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDMxLjMgMjkuNVwiIHsuLi5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOCAxczEyIDguMiA3LjQgMTkuN1MxNi42IDI5IDIwIDI1LjZzLTQtNS42LTguNy0xMEwyMi44IDFcIiBmaWxsPVwicmdiYSgyMjcsNiwxOSwuNilcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMi4xIDEyLjNjLTIuNSAzLjItNi4xIDQuOC04LjkgNC4zTDMuNiAyOC44Yy0uNy45LTEuOSAxLTIuOC4zLS45LS43LTEtMS45LS40LTIuOEwxMCAxNC4xYy0xLjMtMi41LS42LTYuNCAyLTkuNyAzLjItNCA4LTUuNSAxMC44LTMuNHMyLjQgNy4yLS43IDExLjN6XCIgZmlsbD1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICApXHJcbiAgICB9IFxyXG59IiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2lyY3VzIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIHJldHVybiAoPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAzNiAzNlwiICB7Li4udGhpcy5wcm9wcy5zdmd9IGhlaWdodD1cIjEwMCVcIj5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNERDJFNDRcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMzMgMzNhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0ybDEtMTJoMjhsMSAxMnpcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNFQTU5NkVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTMgMzVjLS43OTItMS44NzUtMS43NS0zLjI5MS0zLjQxNy00LjY2NiAxLjc1LTEuNDU5IDQuNTQyLTUuNSA1LjI1LTguMjkyczIuNzUgOC4xMjUgMi4wNDIgMTAuNjI1UzEzIDM1IDEzIDM1em0xMC4zMDMgMGMuNzkxLTEuODc1IDEuNzUtMy4yOTEgMy40MTYtNC42NjYtMS43NS0xLjQ1OS00LjU0MS01LjUtNS4yNS04LjI5Mi0uNzA3LTIuNzkyLTIuNzUgOC4xMjUtMi4wNCAxMC42MjUuNzA4IDIuNSAzLjg3NCAyLjMzMyAzLjg3NCAyLjMzM3pcIlxyXG4gICAgICAgICAgICAgICAgPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNCRTE5MzFcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMy43MjggMjQuMjYzQTIuNSAyLjUgMCAwMDggMjIuNWMwLS41NjUtLjE5NS0xLjA4MS0uNTExLTEuNUg0bC0uMjcyIDMuMjYzem0yOC41NDQgMEwzMiAyMWgtMy40ODlBMi40ODIgMi40ODIgMCAwMDI4IDIyLjVhMi41IDIuNSAwIDAwNC4yNzIgMS43NjN6XCJcclxuICAgICAgICAgICAgICAgID48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTRcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjIyXCIgY3k9XCIyM1wiIHI9XCIyXCIgZmlsbD1cIiNCRTE5MzFcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCIxMFwiIGN5PVwiMjNcIiByPVwiMlwiIGZpbGw9XCIjQkUxOTMxXCI+PC9jaXJjbGU+XHJcbiAgICAgICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMjZcIiBjeT1cIjIzXCIgcj1cIjJcIiBmaWxsPVwiI0JFMTkzMVwiPjwvY2lyY2xlPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0yMyAzNUgxM3MyLTYgMi0xM2g2YzAgNyAyIDEzIDIgMTN6TTE3IDJoMnY3aC0yelwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM1NUFDRUVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGQ9XCJNMTguODM4LjIwNkMxNy42NjcuMDQyIDE3IC4zMTggMTcgMS40MTh2MWMwIDEuMS44NjUgMS43NTMgMS45MjMgMS40NTFsNS4xNTQtLjkwMWMxLjcxNS0uMzQzIDEuNTQ4LTEuNTkzLjA4NS0xLjg4NEwxOC44MzguMjA2elwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgICAgICBmaWxsPVwiI0NDRDZERFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZD1cIk0xOCA2bC0uMDgxLjEyM0MxMC45MzggMTYuOTgxIDMgMTUuMDE1IDMgMTl2Mi41YTIuNSAyLjUgMCAwMDQuOTUuNUgxMmEyIDIgMCAwMDQgMGg0YTIgMiAwIDAwNCAwaDQuMDVhMi41IDIuNSAwIDAwNC45NS0uNVYxOWMwLTQtOC0yLTE1LTEzelwiXHJcbiAgICAgICAgICAgICAgICA+PC9wYXRoPlxyXG4gICAgICAgICAgICAgICAgPGcgZmlsbD1cIiNGNUY4RkFcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk0OCA2LjA3OGwtLjAzLjA0NUMxNy4xMzIgMTEuNjE5IDEwLjgxMSAxNi4xMjYgOCAxOHY0YTIgMiAwIDAwNCAwdi00Yy45ODItLjk4MiA1LjgxMy02Ljc4NyA1Ljk4NC0xMS43MzItLjAxLS4wNjQtLjAyNy0uMTI2LS4wMzYtLjE5em0uMDguMzk4QzE4LjMyNCAxMS4zNzQgMjMuMDMxIDE3LjAzMSAyNCAxOHY0YTIgMiAwIDAwNCAwdi00Yy0yLjc1LTEuODMzLTguOTUzLTYuMTktOS45NzItMTEuNTI0elwiPjwvcGF0aD5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTE3Ljk4NCA2LjI3QzE3LjkyMiA4LjM0NiAxNy42MDYgMTYuMzk0IDE2IDE4djRhMiAyIDAgMDA0IDB2LTRjLTEuNTY0LTEuNTY0LTEuOTA1LTkuMjQxLTEuOTc5LTExLjU1OS0uMDExLS4wNTctLjAyNy0uMTEzLS4wMzctLjE3MXpcIj48L3BhdGg+XHJcbiAgICAgICAgICAgICAgICA8L2c+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIClcclxuICAgIH0gXHJcbn0iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodGNvcmRMb2dvIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5wcm9wc1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAxNjggMTY4LjY5XCIgey4uLnByb3BzfSBoZWlnaHQ9XCIxMDAlXCIgd2lkdGg9e3Byb3BzLnNpemV9PlxyXG4gICAgICAgICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19hXCIgeDE9ezY2Ljd9IHkxPXstNDg3Ljd9IHgyPXs2Ni43fSB5Mj17LTUwOC43M30gZ3JhZGllbnRUcmFuc2Zvcm09XCJtYXRyaXgoMSAwIDAgLTEgMCAtNDA4KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezB9IHN0b3BDb2xvcj1cIiNlMzA2MTNcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9ezF9IHN0b3BDb2xvcj1cIiM3MzFhMTRcIiAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpbmVhckdyYWRpZW50IGlkPVwicHJlZml4X19iXCIgeDE9ezEwMS43fSB5MT17LTQ4Ny43fSB4Mj17MTAxLjd9IHkyPXstNTA4LjczfSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UyMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9XCJwcmVmaXhfX2NcIiB4MT17ODR9IHkxPXstNDA4fSB4Mj17ODR9IHkyPXstNTc2LjY5fSBncmFkaWVudFRyYW5zZm9ybT1cIm1hdHJpeCgxIDAgMCAtMSAwIC00MDgpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MH0gc3RvcENvbG9yPVwiI2UzMDYxM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD17MX0gc3RvcENvbG9yPVwiIzczMWExM1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD5cclxuICAgICAgICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGZpbGw9XCIjZmZmXCIgZD1cIk0xNC45IDM1LjNoMTM5LjJWMTMzSDE0Ljl6XCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNNjYuNyA3OS43Yy01LjQgMC05LjggNC43LTkuOCAxMC41czQuNCAxMC41IDkuOCAxMC41IDkuOC00LjcgOS44LTEwLjUtNC40LTEwLjUtOS44LTEwLjV6XCIgZmlsbD1cInVybCgjcHJlZml4X19hKVwiIC8+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEwMS43IDc5LjdjLTUuNCAwLTkuOCA0LjctOS44IDEwLjVzNC40IDEwLjUgOS44IDEwLjUgOS44LTQuNyA5LjgtMTAuNS00LjQtMTAuNS05LjgtMTAuNXpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2IpXCIgLz5cclxuICAgICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwdjE2OGwxNjggLjY5VjB6bTExMS4zIDEyNC4xcy0zLjQtNC4xLTYuMy03LjdjMTIuNi0zLjUgMTcuNC0xMS4zIDE3LjQtMTEuM2E1Mi41MiA1Mi41MiAwIDAxLTExLjEgNS42IDY4LjYzIDY4LjYzIDAgMDEtMzguOSA0IDcwLjEyIDcwLjEyIDAgMDEtMTQuMS00LjEgNDguODggNDguODggMCAwMS03LjEtMy4zYy0uMy0uMi0uNi0uMy0uOS0uNWEuNzYuNzYgMCAwMC0uNC0uMmMtMS43LTEtMi42LTEuNi0yLjYtMS42czQuNiA3LjYgMTYuOCAxMS4yYy0yLjkgMy42LTYuNCA3LjktNi40IDcuOS0yMS4yLS42LTI5LjMtMTQuNS0yOS4zLTE0LjUgMC0zMC42IDEzLjgtNTUuNCAxMy44LTU1LjQgMTMuOC0xMC4zIDI2LjktMTAgMjYuOS0xMGwxIDEuMUM1Mi44IDUwLjMgNDUgNTcuOSA0NSA1Ny45YTU2LjIgNTYuMiAwIDAxNS43LTIuNyA3Mi4xOSA3Mi4xOSAwIDAxMjEuOC02IDguNzUgOC43NSAwIDAxMS42LS4yIDg5LjEgODkuMSAwIDAxMTkuNC0uMiA3OC40NSA3OC40NSAwIDAxMjguOSA5LjFzLTcuNS03LjItMjMuOS0xMi4xbDEuMy0xLjVzMTMuMS0uMyAyNi45IDEwYzAgMCAxMy44IDI0LjggMTMuOCA1NS40LjEtLjEtOCAxMy44LTI5LjIgMTQuNHpcIiBmaWxsPVwidXJsKCNwcmVmaXhfX2MpXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFYyQ19TZXR0aW5nc1RpdGxlIGZyb20gXCIuL3NldHRpbmdzVGl0bGVcIjtcclxuXHJcbi8qKlxyXG4gKiBAdHlwZSB7dHlwZW9mIGltcG9ydChcInJlYWN0XCIpfVxyXG4gKi9cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IG1hcmdpbk1vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdXHJcbmxldCBjb2xvck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbG9yU3RhbmRhcmQpWzBdXHJcbmxldCBzaXplTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXVxyXG5sZXQgc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbmNvbnN0IEd1aWxkTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0R3VpbGRzKVswXS5kZWZhdWx0XHJcbmNvbnN0IHJlbGF0aW9uU2hpcE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFJlbGF0aW9uc2hpcHMpWzBdLmRlZmF1bHRcclxuY29uc3Qgc2Vzc2lvbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFNlc3Npb25zKVswXS5kZWZhdWx0XHJcbmNvbnN0IHVzZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilbMF0uZGVmYXVsdFxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0FjY291bnRJbmZvcyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgaWYoIW1hcmdpbk1vZHVsZTIpbWFyZ2luTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHRNYXJnaW5oNSlbMF1cclxuICAgICAgICBpZighY29sb3JNb2R1bGUpY29sb3JNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXVxyXG4gICAgICAgIGlmKCFzaXplTW9kdWxlKXNpemVNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMzIpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJBY2NvdW50IEluZm9zXCIvPixcclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgIDxoNSBjbGFzc05hbWU9e2NvbG9yTW9kdWxlLmNvbG9yU3RhbmRhcmQrXCIgXCIrc2l6ZU1vZHVsZS5zaXplMTQrXCIgXCIrbWFyZ2luTW9kdWxlMi5oNStcIiBcIittYXJnaW5Nb2R1bGUyLmRlZmF1bHRNYXJnaW5oNX0+XHJcbiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIDxDb2RlQ29udGVudCBjb250ZW50PXt0aGlzLmdldFByb2ZpbGVWYWx1ZSgpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzXHJcbiAgICAgICAgICAgICAgICA8L2g1PlxyXG4gICAgICAgICAgICAgICAgPENvZGVDb250ZW50IGNvbnRlbnQ9e3RoaXMuZ2V0U3RhdGlzdGljcygpfSBsYW5ndWFnZT1cImRpZmZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICBDb25uZWN0ZWQgU2Vzc2lvbnNcclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8Q29kZUNvbnRlbnQgY29udGVudD17dGhpcy5nZXRTZXNzaW9uVmFsdWUoKX0gbGFuZ3VhZ2U9XCJkaWZmXCIgLz5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj5cclxuICAgICAgICBdXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2Vzc2lvblZhbHVlKCl7XHJcbiAgICAgICAgY29uc3Qgc2Vzc2lvbnNSYXcgPSBzZXNzaW9uTW9kdWxlLmdldFNlc3Npb25zKClcclxuICAgICAgICBjb25zdCBzZXNzaW9ucyA9IE9iamVjdC5rZXlzKHNlc3Npb25zUmF3KS5maWx0ZXIoZSA9PiBlICE9PSBcImFsbFwiKS5tYXAoZSA9PiBzZXNzaW9uc1Jhd1tlXSlcclxuXHJcbiAgICAgICAgaWYoc2Vzc2lvbnMubGVuZ3RoID09PSAwKXJldHVybiBcIi0gTm8gc2Vzc2lvbiBkZXRlY3RlZC4gUGxlYXNlIHRyeSBpbiBhIGZldyBzZWNvbmRzXCJcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gc2Vzc2lvbnMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gYCsgaWQ6ICR7ZS5zZXNzaW9uSWR9XHJcbisgb3M6ICR7ZS5jbGllbnRJbmZvLm9zWzBdLnRvVXBwZXJDYXNlKCkrZS5jbGllbnRJbmZvLm9zLnNsaWNlKDEpfVxyXG4rIGNsaWVudDogJHtlLmNsaWVudEluZm8uY2xpZW50fVxyXG4rIHN0YXR1czogJHtlLnN0YXR1c31cclxuKyBBY3Rpdml0aWVzOiAke2UuYWN0aXZpdGllcy5sZW5ndGh9YFxyXG4gICAgICAgIH0pLmpvaW4oXCJcXG5cIitcIi1cIi5yZXBlYXQoMzgpK1wiXFxuXCIpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJvZmlsZVZhbHVlKCl7XHJcbiAgICAgICAgY29uc3QgdXNlciA9IHVzZXJNb2R1bGUuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEB0eXBlIHtEYXRlfVxyXG4gICAgICAgICAqL1xyXG4gICAgICAgIGNvbnN0IGNyZWF0ZWRBdCA9IHVzZXIuY3JlYXRlZEF0XHJcblxyXG4gICAgICAgIGxldCBhdmF0YXJVUkwgPSB1c2VyLmF2YXRhclVSTFxyXG4gICAgICAgIGlmKHVzZXIuYXZhdGFyICYmIHVzZXIuYXZhdGFyLnN0YXJ0c1dpdGgoXCJhX1wiKSl7XHJcbiAgICAgICAgICAgIGF2YXRhclVSTCA9IHVzZXIuZ2V0QXZhdGFyVVJMKFwiZ2lmXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZihhdmF0YXJVUkwuc3RhcnRzV2l0aChcIi9cIikpe1xyXG4gICAgICAgICAgICBhdmF0YXJVUkwgPSBcImh0dHBzOi8vZGlzY29yZC5jb21cIithdmF0YXJVUkxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYXZhdGFyVVJMLmVuZHNXaXRoKFwiP3NpemU9MTI4XCIpKXtcclxuICAgICAgICAgICAgYXZhdGFyVVJMID0gYXZhdGFyVVJMLnJlcGxhY2UoXCI/c2l6ZT0xMjhcIiwgXCI/c2l6ZT00MDk2XCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gYCsgVXNlcm5hbWU6ICR7dXNlci51c2VybmFtZX1cclxuKyBEaXNjcmltaW5hdG9yOiAke3VzZXIuZGlzY3JpbWluYXRvcn1cclxuKyBUYWc6ICR7dXNlci50YWd9XHJcbisgSUQ6ICR7dXNlci5pZH1cclxuKyBBdmF0YXI6ICR7dXNlci5hdmF0YXJ9XHJcbisgQXZhdGFyIFVSTDogJHthdmF0YXJVUkx9XHJcbisgQ3JlYXRpb24gRGF0ZTogJHsoY3JlYXRlZEF0LmdldERhdGUoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9LyR7KGNyZWF0ZWRBdC5nZXRNb250aCgpKzEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgXCIwXCIpfS8keyhjcmVhdGVkQXQuZ2V0RnVsbFllYXIoKSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9ICR7Y3JlYXRlZEF0LmdldEhvdXJzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9aCAke2NyZWF0ZWRBdC5nZXRNaW51dGVzKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCBcIjBcIil9bWluICR7Y3JlYXRlZEF0LmdldFNlY29uZHMoKX1zXHJcbisgRmxhZ3M6ICR7dXNlci5mbGFnc31cclxuKyBIYXMgTml0cm86ICR7dXNlci5oYXNQcmVtaXVtU3Vic2NyaXB0aW9uID8gXCJZZXNcIiA6IFwiTm9cIn1cclxuLSBFbWFpbDogJHt1c2VyLmVtYWlsfVxyXG4tIDJGQTogJHt1c2VyLm1mYUVuYWJsZWQgPyBcIlllc1wiIDogXCJOb1wifVxyXG4tIEhhcyBCZWVuIE9uIE1vYmlsZTogJHt1c2VyLm1vYmlsZSA/IFwiWWVzXCIgOiBcIk5vXCJ9XHJcbi0gUGhvbmU6ICR7dXNlci5waG9uZSB8fCBcIk5vbmVcIn1cclxuLSBWZXJpZmllZDogJHt1c2VyLnZlcmlmaWVkfWBcclxuICAgIH1cclxuXHJcbiAgICBnZXRTdGF0aXN0aWNzKCl7XHJcblxyXG4gICAgICAgIGNvbnN0IGd1aWxkcyA9IE9iamVjdC52YWx1ZXMoR3VpbGRNb2R1bGUuZ2V0R3VpbGRzKCkpXHJcbiAgICAgICAgY29uc3QgcmVsYXRpb25zID0gT2JqZWN0LmtleXMocmVsYXRpb25TaGlwTW9kdWxlLmdldFJlbGF0aW9uc2hpcHMoKSlcclxuICAgICAgICBjb25zdCBmcmllbmRzID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0ZyaWVuZChlKSlcclxuICAgICAgICBjb25zdCBibG9ja2VkID0gcmVsYXRpb25zLmZpbHRlcihlID0+IHJlbGF0aW9uU2hpcE1vZHVsZS5pc0Jsb2NrZWQoZSkpXHJcblxyXG4gICAgICAgIHJldHVybiBgKyBTZXJ2ZXIgQ291bnQ6ICR7Z3VpbGRzLmxlbmd0aH0gc2VydmVyc1xyXG4rIFJlbGF0aW9uczogJHtyZWxhdGlvbnMubGVuZ3RofSByZWxhdGlvbnNcclxuKyBGcmllbmRzIENvdW50OiAke2ZyaWVuZHMubGVuZ3RofSBmcmllbmRzXHJcbi0gQmxvY2tlZCBVc2VycyBDb3VudDogJHtibG9ja2VkLmxlbmd0aH0gYmxvY2tlZCB1c2Vyc2BcclxuICAgIH1cclxufVxyXG5cclxuXHJcbmxldCBoaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbmxldCBtZXNzYWdlTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmt1cClbMF1cclxubGV0IG1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcblxyXG5jbGFzcyBDb2RlQ29udGVudCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWVzc2FnZU1vZHVsZTEpbWVzc2FnZU1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJrdXApWzBdXHJcbiAgICAgICAgaWYoIW1lc3NhZ2VNb2R1bGUyKW1lc3NhZ2VNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUubWVzc2FnZUNvbnRlbnQpWzBdXHJcbiAgICAgICAgaWYoIXNjcm9sbGJhck1vZHVsZTEpc2Nyb2xsYmFyTW9kdWxlMSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNjcm9sbGJhckdob3N0SGFpcmxpbmUpWzBdXHJcbiAgICAgICAgaWYoIWhpZ2h0bGlnaHRKUyloaWdodGxpZ2h0SlMgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5oaWdobGlnaHQpWzBdXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzPXtgJHttZXNzYWdlTW9kdWxlMS5tYXJrdXB9ICR7bWVzc2FnZU1vZHVsZTIubWVzc2FnZUNvbnRlbnR9YH0+XHJcbiAgICAgICAgICAgIDxwcmU+XHJcbiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz17YCR7c2Nyb2xsYmFyTW9kdWxlMS5zY3JvbGxiYXJHaG9zdEhhaXJsaW5lfSBobGpzYH0gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tfX2h0bWw6IGhpZ2h0bGlnaHRKUy5oaWdobGlnaHQodGhpcy5wcm9wcy5sYW5ndWFnZSwgdGhpcy5wcm9wcy5jb250ZW50KS52YWx1ZX19PlxyXG5cclxuICAgICAgICAgICAgICAgIDwvY29kZT5cclxuICAgICAgICAgICAgPC9wcmU+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXtCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b204KVswXS5tYXJnaW5Cb3R0b204fT48L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn0iLCIvLyBHb29kIGx1Y2sgdG8gcmVhZCBteSBjb2RlLCBFdmVuIG1lIGNhbid0IHJlYWQgaXQgcHJvcGVybHkuXHJcblxyXG5pbXBvcnQgeyBzdGF0IH0gZnJvbSBcImZzXCJcclxuaW1wb3J0IHsgdXVpZHY0IH0gZnJvbSBcIi4uL21vZHVsZXMvZGlzdGFudFwiXHJcbmltcG9ydCB3ZWJwYWNrTW9kdWxlcyBmcm9tIFwiLi4vbW9kdWxlcy93ZWJwYWNrTW9kdWxlc1wiXHJcbmltcG9ydCB7IHJlbW90ZSB9IGZyb20gXCJlbGVjdHJvblwiXHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCJcclxuXHJcbmxldCBmb3JtTW9kdWxlXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFwaVByZXZpZXcgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKCl7XHJcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKVxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIHN0YXRlczogW11cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgaWYoIWZvcm1Nb2R1bGUpZm9ybU1vZHVsZSA9IHdlYnBhY2tNb2R1bGVzLmZpbmQoZSA9PiBlLkZvcm1TZWN0aW9uKVxyXG4gICAgICAgIC8qKiBcclxuICAgICAgICAgKiBAdHlwZSB7RnVuY3Rpb25bXX1cclxuICAgICAgICAgKi9cclxuICAgICAgICBjb25zdCBhbGxDb21wb25lbnRzID0gWy4uLm5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cykubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMod2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXSkubWFwKGsgPT4gd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50c1tlXVtrXSlcclxuICAgICAgICB9KS5mbGF0KCkpXVxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIDxmb3JtTW9kdWxlLkZvcm1TZWN0aW9uIHRhZz1cImgyXCIgdGl0bGU9XCJMaWdodGNvcmQncyBBcGkgQXZhaWxsYWJsZSBjb21wb25lbnRzXCI+XHJcbiAgICAgICAgICAgICAgICA8Zm9ybU1vZHVsZS5Gb3JtVGV4dCB0eXBlPVwiZGVzY3JpcHRpb25cIiBjbGFzc05hbWU9XCJcIiBzZWxlY3RhYmxlPXtmYWxzZX0+XHJcbiAgICAgICAgICAgICAgICAgICAgVGhlc2UgY29tcG9uZW50cyBhcmUgaGVyZSBmb3IgdGhlIHBsdWdpbiBkZXZzLiBUaGV5IGNhbiBxdWlja2x5IGVtYmVkIGFueSBjb21wb25lbnQgYmVsb3cgd2l0aCB0aGlzIHBhbmVsLlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3ttYXJnaW5Ub3A6IFwiMjBweFwifX0+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+QWxsIHRoZXNlIGNvbXBvbmVudHMgaGF2ZSBlcnJvciBoYW5kbGluZy4gSWYgeW91IHdhbnQgbm9uZSwgYWRkIGAub3JpZ2luYWxgIGFmdGVyIHRoZSBjb21wb25lbnQgcGF0aC48L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PlxyXG4gICAgICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPldlIGRvIG5vdCByZWNvbW1lbmQgbW9kaWZ5aW5nIHRoZXNlIGNvbXBvbmVudCB3aXRoIHBsdWdpbnMuIE9ubHkgZG8gdGhpcyBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPC9MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveD5cclxuICAgICAgICAgICAgICAgIDwvZm9ybU1vZHVsZS5Gb3JtVGV4dD5cclxuICAgICAgICAgICAgICAgIDxNYXJnaW5Ub3A+PC9NYXJnaW5Ub3A+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gY29sb3I9XCJicmFuZFwiIGxvb2s9XCJvdXRsaW5lZFwiIHNpemU9XCJtZWRpdW1cIiBob3ZlckNvbG9yPVwiZ3JlZW5cIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVtb3RlLnNoZWxsLm9wZW5FeHRlcm5hbChcImh0dHBzOi8vbGlnaHRjb3JkLmRlcm9rdS54eXovTGlnaHRjb3JkQXBpL2RvY3NcIilcclxuICAgICAgICAgICAgICAgIH19IHdyYXBwZXI9e2ZhbHNlfT5cclxuICAgICAgICAgICAgICAgICAgICBEb2N1bWVudGF0aW9uXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Zvcm1Nb2R1bGUuRm9ybVNlY3Rpb24+LFxyXG4gICAgICAgICAgICBhbGxDb21wb25lbnRzLm1hcChjb21wID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBOYW1lID0gY29tcC5kaXNwbGF5TmFtZSB8fCBjb21wLm5hbWVcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBQYXRoID0gYExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy4ke09iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpLmZpbmQoZSA9PiB3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzW2VdW2NvbXBOYW1lXSl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDxDb21wb25lbnRQcmV2aWV3IGtleT17Y29tcFBhdGh9IGNvbXA9e2NvbXB9IC8+XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgXVxyXG4gICAgfVxyXG5cclxuICAgIGdldCByZW5kZXJzKCl7XHJcblxyXG4gICAgfVxyXG59XHJcblxyXG5jbGFzcyBDb21wb25lbnRQcmV2aWV3IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICB0YWI6IFwicHJldmlld1wiLFxyXG4gICAgICAgICAgICBlbGVtOiBwcm9wcy5jb21wLFxyXG4gICAgICAgICAgICBvcHRpb25zOiB7fVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBjb25zdCBjb21wID0gdGhpcy5wcm9wcy5jb21wXHJcbiAgICAgICAgbGV0IEFsbFByZXZpZXdzID0gW11cclxuICAgICAgICBpZihjb21wLkFsbFByZXZpZXdzKUFsbFByZXZpZXdzID0gY29tcC5BbGxQcmV2aWV3c1xyXG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGVcclxuICAgICAgICBsZXQgZ2V0UHJvcHMgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBmaW5hbCA9IHt9XHJcbiAgICAgICAgICAgIEFsbFByZXZpZXdzLmZvckVhY2goY2F0ZWdvcnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmluYWxbT2JqZWN0LmtleXMoY2F0ZWdvcnlbMF0pWzBdXSA9IGNhdGVnb3J5WzBdW09iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXV1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgT2JqZWN0LmtleXMoc3RhdGUub3B0aW9ucykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgZmluYWxba2V5XSA9IEFsbFByZXZpZXdzLmZpbmQoZSA9PiBlLmZpbmQoZSA9PiBlW2tleV0pKVtzdGF0ZS5vcHRpb25zW2tleV1dW2tleV1cclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgcmV0dXJuIGZpbmFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCByZW5kZXJQcmV2aWV3ID0gKCkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e21hcmdpbjogXCIyMHB4XCJ9fT5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMzBweCAzMHB4XCIsIFxyXG4gICAgICAgICAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG4gICAgICAgICAgICAgICAgfX0gY2xhc3NOYW1lPVwibGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICB7UmVhY3QuY3JlYXRlRWxlbWVudChjb21wLCBnZXRQcm9wcygpKX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHJlbmRlckNvZGUgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiA8ZGl2IHN0eWxlPXt7bWFyZ2luOiBcIjIwcHhcIn19PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZzogXCIzMHB4IDMwcHhcIiwgXHJcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjhweFwiXHJcbiAgICAgICAgICAgICAgICB9fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ1N1YlRpdGxlPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBKU1hcclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzeFwiIGNvbnRlbnQ9e2dlbmVyYXRlQ29kZShcImpzeFwiKX0vPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+ICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RcclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5FcnJvckNhdGNoZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkNvZGVCbG9jayBsYW5ndWFnZT1cImpzXCIgY29udGVudD17Z2VuZXJhdGVDb2RlKFwicmVhY3RcIil9Lz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSl9XHJcbiAgICAgICAgICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuRXJyb3JDYXRjaGVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgZ2V0U3RyRm9yUHJvcCA9ICh2YWx1ZSwgY29tcFBhdGgsIGxhbmcpID0+IHtcclxuICAgICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVxyXG4gICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIil7XHJcbiAgICAgICAgICAgICAgICBpZih2YWx1ZSAmJiB2YWx1ZS4kJHR5cGVvZiAmJiAodmFsdWUuJCR0eXBlb2YgPT09IFN5bWJvbC5mb3IoXCJyZWFjdC5lbGVtZW50XCIpIHx8IHZhbHVlLiQkdHlwZW9mID09PSAweGVhYzcpKXtcclxuICAgICAgICAgICAgICAgICAgICBpZihjb21wUGF0aCA9PT0gXCJMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihsYW5nID09PSBcInJlYWN0XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG5tYXJnaW5Ub3A6IFwiMjBweFwiLCBtYXJnaW5Cb3R0b206IFwiMjBweFwiXHJcbn19LFxyXG5SZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1xyXG5iYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1zZWNvbmRhcnkpXCIsXHJcbnBhZGRpbmc6IFwiMzBweCAzMHB4XCIsXHJcbmJvcmRlclJhZGl1czogXCI4cHhcIlxyXG59LCBjbGFzc05hbWU6IFwibGMtdGFiLWJveC1zaGFkb3dcIiB9LFxyXG5SZWFjdC5jcmVhdGVFbGVtZW50KExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlLCBudWxsLCBcIlByZXZpZXcgdGFic1wiKVxyXG4pXHJcbilgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPXt7XHJcbm1hcmdpblRvcDogXCIyMHB4XCIsIG1hcmdpbkJvdHRvbTogXCIyMHB4XCJcclxufX0+XHJcbjxkaXYgc3R5bGU9e3tcclxuICAgIGJhY2tncm91bmRDb2xvcjogXCJ2YXIoLS1iYWNrZ3JvdW5kLXNlY29uZGFyeSlcIiwgXHJcbiAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgIGJvcmRlclJhZGl1czogXCI4cHhcIlxyXG59fSBjbGFzc05hbWU9XCJsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlRpdGxlPlByZXZpZXcgdGFiczwvTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuVGl0bGU+XHJcbjwvZGl2PlxyXG48L2Rpdj5gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiWW91ciBjb21wb25lbnRzIGhlcmUuXCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgXCIgICAgXCIpXHJcbiAgICAgICAgICAgIH1lbHNlIGlmKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBnZW5lcmF0ZUNvZGUgPSBmdW5jdGlvbihsYW5nKXsgLy8gY29kZSBmb3JtYXR0aW5nIGlzIGhhcmRcclxuICAgICAgICAgICAgY29uc3QgY29tcE5hbWUgPSBjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZVxyXG4gICAgICAgICAgICBsZXQgY2F0ZWdvcmllcyA9IE9iamVjdC5rZXlzKHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMpXHJcbiAgICAgICAgICAgIGNvbnN0IGNvbXBDYXRlZ29yeSA9IGNhdGVnb3JpZXMuZmluZChlID0+IHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHNbZV1bY29tcE5hbWVdKVxyXG4gICAgICAgICAgICBjb25zdCBjb21wUGF0aCA9IGBMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuJHtjb21wQ2F0ZWdvcnl9LiR7Y29tcE5hbWV9YFxyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IGdldFByb3BzKClcclxuXHJcbiAgICAgICAgICAgIGlmKGxhbmcgPT09IFwianN4XCIpe1xyXG4gICAgICAgICAgICAgICAgbGV0IHByb3BTdHJpbmdzID0gW11cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlblByb3AgPSBudWxsXHJcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChrZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGtleSA9PSBcImNoaWxkcmVuXCIpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlblByb3AgPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKVxyXG4gICAgICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3RyID0ga2V5K1wiPVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBKU09OLnN0cmluZ2lmeShwcm9wc1trZXldKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBgeyR7Z2V0U3RyRm9yUHJvcChwcm9wc1trZXldLCBjb21wUGF0aCwgbGFuZyl9fWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgbGV0IG9wZW5UYWdcclxuICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuUHJvcCl7XHJcbiAgICAgICAgICAgICAgICAgICAgb3BlblRhZyA9IGA8JHtjb21wUGF0aH0gJHtwcm9wU3RyaW5ncy5qb2luKFwiIFwiKX0+YFxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZVRhZyA9IGA8LyR7Y29tcFBhdGh9PmBcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7b3BlblRhZ31cXG4gICAgJHtjaGlsZHJlblByb3B9XFxuJHtjbG9zZVRhZ31gXHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICBvcGVuVGFnID0gYDwke2NvbXBQYXRofSAke3Byb3BTdHJpbmdzLmpvaW4oXCIgXCIpfS8+YFxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcGVuVGFnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGxhbmcgPT09IFwicmVhY3RcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBwcm9wcy5jaGlsZHJlbiB8fCBudWxsXHJcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvcHMuY2hpbGRyZW5cclxuICAgICAgICAgICAgICAgIGlmKGNoaWxkcmVuICYmIGNoaWxkcmVuLiQkdHlwZW9mICYmIChjaGlsZHJlbi4kJHR5cGVvZiA9PT0gU3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIikgfHwgY2hpbGRyZW4uJCR0eXBlb2YgPT09IDB4ZWFjNykpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gZ2V0U3RyRm9yUHJvcChjaGlsZHJlbiwgY29tcFBhdGgsIGxhbmcpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcFN0cmluZ3MgPSBbXVxyXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcHMpLmZvckVhY2goa2V5ID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgdmlzaWJsZUtleSA9IC9bXlxcd1xcZF9dL2cudGVzdChrZXkpID8gSlNPTi5zdHJpbmdpZnkoa2V5KSA6IGtleVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSB2aXNpYmxlS2V5K1wiOiBcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBwcm9wc1trZXldID09PSBcInN0cmluZ1wiKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IEpTT04uc3RyaW5naWZ5KHByb3BzW2tleV0pXHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ciArPSBnZXRTdHJGb3JQcm9wKHByb3BzW2tleV0sIGNvbXBQYXRoLCBsYW5nKS5zcGxpdChcIlxcblwiKS5tYXAoKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaSA9PT0gMClyZXR1cm4gc3RyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCIgICAgXCIgKyBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuam9pbihcIlxcblwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBwcm9wU3RyaW5ncy5wdXNoKHN0cilcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvcE9iamVjdCA9IFwie1wiXHJcbiAgICAgICAgICAgICAgICBpZihwcm9wU3RyaW5ncy5sZW5ndGgpe1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BTdHJpbmdzLmZvckVhY2goKHN0ciwgaSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNMYXN0ID0gaSA9PT0gcHJvcFN0cmluZ3MubGVuZ3RoIC0gMVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXNGaXJzdCA9IGkgPT09IDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWlzRmlyc3Qpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBcIixcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJcXG4gICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcE9iamVjdCArPSBzdHJcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXNMYXN0KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz1cIlxcbn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHByb3BPYmplY3QgKz0gXCJ9XCJcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbkRhdGEgPSB0eXBlb2YgY2hpbGRyZW4gPT09IFwic3RyaW5nXCIgJiYgY2hpbGRyZW4uc3RhcnRzV2l0aChcIlJlYWN0LmNyZWF0ZUVsZW1lbnRcIikgPyBjaGlsZHJlbiA6IEpTT04uc3RyaW5naWZ5KGNoaWxkcmVuKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBSZWFjdC5jcmVhdGVFbGVtZW50KCR7Y29tcFBhdGh9LCAke3Byb3BPYmplY3R9LCAke2NoaWxkcmVuRGF0YX0pYFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBoZWxwID0gY29tcC5oZWxwIHx8IHt9XHJcbiAgICAgICAgbGV0IGluZm8gPSBoZWxwLmluZm8gPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJpbmZvXCI+XHJcbiAgICAgICAgICAgIHtoZWxwLmluZm99XHJcbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgIGxldCB3YXJuID0gaGVscC53YXJuID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwid2FyblwiPlxyXG4gICAgICAgICAgICB7aGVscC53YXJufVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgZGFuZ2VyID0gaGVscC5kYW5nZXIgPyA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94IHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAge2hlbHAuZGFuZ2VyfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICBsZXQgZXJyb3IgPSBoZWxwLmVycm9yID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwiZXJyb3JcIj5cclxuICAgICAgICAgICAge2hlbHAuZXJyb3J9XHJcbiAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuQWxlcnRCb3g+IDogbnVsbFxyXG4gICAgICAgIGxldCBzdWNjZXNzID0gaGVscC5zdWNjZXNzID8gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5BbGVydEJveCB0eXBlPVwic3VjY2Vzc1wiPlxyXG4gICAgICAgICAgICB7aGVscC5zdWNjZXNzfVxyXG4gICAgICAgIDwvd2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLkFsZXJ0Qm94PiA6IG51bGxcclxuICAgICAgICByZXR1cm4gKDxkaXY+XHJcbiAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAgICAgIHtjb21wLmRpc3BsYXlOYW1lIHx8IGNvbXAubmFtZX1cclxuICAgICAgICAgICAgPC93aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmdlbmVyYWwuU2V0dGluZ3NUaXRsZT5cclxuICAgICAgICAgICAge2luZm99XHJcbiAgICAgICAgICAgIHtzdWNjZXNzfVxyXG4gICAgICAgICAgICB7d2Fybn1cclxuICAgICAgICAgICAge2Vycm9yfVxyXG4gICAgICAgICAgICB7ZGFuZ2VyfVxyXG4gICAgICAgICAgICB7QWxsUHJldmlld3MubWFwKGNhdGVnb3J5ID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLm9uQ2xpY2spcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLnRleHQpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIGlmKGNhdGVnb3J5WzBdLmNoaWxkcmVuKXJldHVybiBudWxsXHJcbiAgICAgICAgICAgICAgICBpZihjYXRlZ29yeS5sZW5ndGggPT09IDEpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IE9iamVjdC5rZXlzKGNhdGVnb3J5WzBdKVswXVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5nZW5lcmFsLlNldHRpbmdTdWJUaXRsZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAge2tleX1cclxuICAgICAgICAgICAgICAgICAgICA8L3dpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5TZXR0aW5nU3ViVGl0bGU+LFxyXG4gICAgICAgICAgICAgICAgICAgIDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Ecm9wZG93biBvcHRpb25zPXtjYXRlZ29yeS5tYXAoKGUsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogXCJvcHQtXCIraW5kZXgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogSlNPTi5zdHJpbmdpZnkoZVtPYmplY3Qua2V5cyhlKVswXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KX0gdmFsdWU9e1wib3B0LVwiKyhzdGF0ZS5vcHRpb25zW2tleV0gfHwgXCIwXCIpfSBvbkNoYW5nZT17KHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUub3B0aW9ucywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtrZXldOiAodmFsdWUudmFsdWUgfHwgXCIwXCIpLnJlcGxhY2UoXCJvcHQtXCIsIFwiXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH19IHNlYXJjaGFibGU9e3RydWV9Lz4sXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT17e21hcmdpbkJvdHRvbTogXCI4cHhcIn19PjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgXVxyXG4gICAgICAgICAgICB9KX1cclxuICAgICAgICAgICAgPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuZ2VuZXJhbC5UYWJzIHRhYnM9e1t7bGFiZWw6IFwiUHJldmlld1wiLCBpZDogXCJwcmV2aWV3XCJ9LCB7bGFiZWw6IFwiQ29kZVwiLCBpZDogXCJjb2RlXCJ9XX0gXHJcbiAgICAgICAgICAgICAgICBhY3RpdmU9e3N0YXRlLnRhYn0gY2hpbGRyZW49e3N0YXRlLnRhYiA9PT0gXCJwcmV2aWV3XCIgPyByZW5kZXJQcmV2aWV3KCkgOiByZW5kZXJDb2RlKCl9IG9uQ2hhbmdlPXsodGFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhYlxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9fS8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZX0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5pbXBvcnQgWFN2ZyBmcm9tIFwiLi94U3ZnXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEVkaXRJY29uIGZyb20gXCIuL2ljb25zL2VkaXRcIjtcclxuaW1wb3J0IERlbGV0ZUljb24gZnJvbSBcIi4vaWNvbnMvZGVsZXRlXCI7XHJcbmltcG9ydCBTd2l0Y2ggZnJvbSBcIi4vY29tcG9uZW50cy9zd2l0Y2hcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCB7IHByb2Nlc3NGaWxlIH0gZnJvbSBcIi4uL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyXCI7XHJcbmltcG9ydCBjb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgeyByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuY29uc3QgYW5jaG9yQ2xhc3NlcyA9IEJEVjIuYW5jaG9yQ2xhc3NlcztcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QbHVnaW5DYXJkIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IHRoaXMub25DaGFuZ2UuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNob3dTZXR0aW5ncyA9IHRoaXMuc2hvd1NldHRpbmdzLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmhhc1NldHRpbmdzID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gJiYgdHlwZW9mKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFNldHRpbmdzUGFuZWwpID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICAgICAgdGhpcy5zZXR0aW5nc1BhbmVsID0gXCJcIjtcclxuXHJcbiAgICAgICAgdGhpcy5lZGl0ID0gdGhpcy5lZGl0LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5kZWxldGUgPSB0aGlzLmRlbGV0ZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmVsb2FkID0gdGhpcy5yZWxvYWQuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgY2hlY2tlZDogdGhpcy5wcm9wcy5lbmFibGVkLFxyXG4gICAgICAgICAgICBzZXR0aW5nczogZmFsc2UsXHJcbiAgICAgICAgICAgIHJlbG9hZHM6IDAsXHJcbiAgICAgICAgICAgIHRydXN0ZWQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc1NldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZVNldHRpbmdzKCkge1xyXG4gICAgICAgIHRoaXMucGFuZWxSZWYuY3VycmVudC5pbm5lckhUTUwgPSBcIlwiO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3NldHRpbmdzT3BlbjogZmFsc2V9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRVcGRhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnNldHRpbmdzKSByZXR1cm47XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnNldHRpbmdzUGFuZWwgPT09IFwib2JqZWN0XCIpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuYXBwZW5kQ2hpbGQodGhpcy5zZXR0aW5nc1BhbmVsKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJmb3JrLXBzLTNcIl0pIHJldHVybjtcclxuICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBpc0hpZGRlbiA9IChjb250YWluZXIsIGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKCFjb250YWluZXIpe1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IobmV3IEVycm9yKGBDb250YWluZXIgaXMgdW5kZWZpbmVkLmApKVxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgY1RvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjQm90dG9tID0gY1RvcCArIGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gZWxlbWVudC5vZmZzZXRUb3A7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBlQm90dG9tID0gZVRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuICAoZVRvcCA8IGNUb3AgfHwgZUJvdHRvbSA+IGNCb3R0b20pO1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgY29uc3QgdGhpc05vZGUgPSB0aGlzLnJlZnMuY2FyZE5vZGU7XHJcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXNOb2RlLmNsb3Nlc3QoXCJkaXZbY2xhc3MqPVxcXCJjb250ZW50UmVnaW9uU2Nyb2xsZXItXFxcIl1cIilcclxuICAgICAgICAgICAgaWYgKCFpc0hpZGRlbihjb250YWluZXIsIHRoaXNOb2RlKSkgcmV0dXJuO1xyXG4gICAgICAgICAgICBjb25zdCB0aGlzTm9kZU9mZnNldCA9IERPTS5vZmZzZXQodGhpc05vZGUpO1xyXG4gICAgICAgICAgICBjb25zdCBjb250YWluZXJPZmZzZXQgPSBET00ub2Zmc2V0KGNvbnRhaW5lcik7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gY29udGFpbmVyLnNjcm9sbFRvcDtcclxuICAgICAgICAgICAgY29uc3QgZW5kUG9pbnQgPSB0aGlzTm9kZU9mZnNldC50b3AgLSBjb250YWluZXJPZmZzZXQudG9wICsgY29udGFpbmVyLnNjcm9sbFRvcCAtIDMwO1xyXG4gICAgICAgICAgICBET00uYW5pbWF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMzAwLFxyXG4gICAgICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbmRQb2ludCA+IG9yaWdpbmFsKSBjb250YWluZXIuc2Nyb2xsVG9wID0gb3JpZ2luYWwgKyAocHJvZ3Jlc3MgKiAoZW5kUG9pbnQgLSBvcmlnaW5hbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgY29udGFpbmVyLnNjcm9sbFRvcCA9IG9yaWdpbmFsIC0gKHByb2dyZXNzICogKG9yaWdpbmFsIC0gZW5kUG9pbnQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldFN0cmluZyh2YWx1ZSkge1xyXG4gICAgICAgIGlmICghdmFsdWUpIHJldHVybiBcIj8/P1wiO1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2V0dGluZ3NDb21wb25lbnQoKSB7XHJcbiAgICAgICAgdHJ5IHsgdGhpcy5zZXR0aW5nc1BhbmVsID0gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0U2V0dGluZ3NQYW5lbCgpOyB9XHJcbiAgICAgICAgY2F0Y2ggKGVycikgeyBVdGlscy5lcnIoXCJQbHVnaW5zXCIsIFwiVW5hYmxlIHRvIGdldCBzZXR0aW5ncyBwYW5lbCBmb3IgXCIgKyB0aGlzLm5hbWUgKyBcIi5cIiwgZXJyKTsgfVxyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtY2FyZCBiZC1hZGRvbi1jYXJkIHNldHRpbmdzLW9wZW4gdWktc3dpdGNoLWl0ZW1cIiwgcmVmOiBcImNhcmROb2RlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtzdHlsZToge1wiZmxvYXRcIjogXCJyaWdodFwiLCBcImN1cnNvclwiOiBcInBvaW50ZXJcIn0sIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZzLnNldHRpbmdzcGFuZWwuaW5uZXJIVE1MID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c2V0dGluZ3M6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoWFN2ZywgbnVsbClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgdHlwZW9mIHRoaXMuc2V0dGluZ3NQYW5lbCA9PT0gXCJvYmplY3RcIiAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBgcGx1Z2luLXNldHRpbmdzLSR7dGhpcy5uYW1lfWAsIGNsYXNzTmFtZTogXCJwbHVnaW4tc2V0dGluZ3NcIiwgcmVmOiBcInNldHRpbmdzcGFuZWxcIn0pLFxyXG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zZXR0aW5nc1BhbmVsICE9PSBcIm9iamVjdFwiICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7aWQ6IGBwbHVnaW4tc2V0dGluZ3MtJHt0aGlzLm5hbWV9YCwgY2xhc3NOYW1lOiBcInBsdWdpbi1zZXR0aW5nc1wiLCByZWY6IFwic2V0dGluZ3NwYW5lbFwiLCBkYW5nZXJvdXNseVNldElubmVySFRNTDoge19faHRtbDogdGhpcy5zZXR0aW5nc1BhbmVsfX0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZFRpdGxlKG5hbWUsIHZlcnNpb24sIGF1dGhvcikge1xyXG4gICAgICAgIGNvbnN0IHRpdGxlID0gXCJ7e25hbWV9fSB2e3t2ZXJzaW9ufX0gYnkge3thdXRob3J9fVwiLnNwbGl0KC8oe3tbQS1aYS16XSt9fSkvKTtcclxuICAgICAgICBjb25zdCBuYW1lSW5kZXggPSB0aXRsZS5maW5kSW5kZXgocyA9PiBzID09IFwie3tuYW1lfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkgdGl0bGVbbmFtZUluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIHtjbGFzc05hbWU6IFwibmFtZSBiZGEtbmFtZVwifSwgbmFtZSk7XHJcbiAgICAgICAgY29uc3QgdmVyc2lvbkluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7dmVyc2lvbn19XCIpO1xyXG4gICAgICAgIGlmIChuYW1lSW5kZXgpIHRpdGxlW3ZlcnNpb25JbmRleF0gPSBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCB7Y2xhc3NOYW1lOiBcInZlcnNpb24gYmRhLXZlcnNpb25cIn0sIHZlcnNpb24pO1xyXG4gICAgICAgIGNvbnN0IGF1dGhvckluZGV4ID0gdGl0bGUuZmluZEluZGV4KHMgPT4gcyA9PSBcInt7YXV0aG9yfX1cIik7XHJcbiAgICAgICAgaWYgKG5hbWVJbmRleCkge1xyXG4gICAgICAgICAgICBjb25zdCBwcm9wcyA9IHtjbGFzc05hbWU6IFwiYXV0aG9yIGJkYS1hdXRob3JcIn07XHJcbiAgICAgICAgICAgIGlmIChhdXRob3IubGluayB8fCBhdXRob3IuaWQpIHtcclxuICAgICAgICAgICAgICAgIHByb3BzLmNsYXNzTmFtZSArPSBgICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7YW5jaG9yQ2xhc3Nlcy5hbmNob3JVbmRlcmxpbmVPbkhvdmVyfWA7XHJcbiAgICAgICAgICAgICAgICBwcm9wcy50YXJnZXQgPSBcIl9ibGFua1wiO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChhdXRob3IubGluaykgcHJvcHMuaHJlZiA9IGF1dGhvci5saW5rO1xyXG4gICAgICAgICAgICAgICAgaWYgKGF1dGhvci5pZCkgcHJvcHMub25DbGljayA9ICgpID0+IHtCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTsgQkRWMi5vcGVuRE0oYXV0aG9yLmlkKTt9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRpdGxlW2F1dGhvckluZGV4XSA9IFJlYWN0LmNyZWF0ZUVsZW1lbnQoYXV0aG9yLmxpbmsgfHwgYXV0aG9yLmlkID8gXCJhXCIgOiBcInNwYW5cIiwgcHJvcHMsIGF1dGhvci5uYW1lKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRpdGxlLmZsYXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlTGluayh0aXRsZSwgdXJsKSB7XHJcbiAgICAgICAgY29uc3QgcHJvcHMgPSB7Y2xhc3NOYW1lOiBcImJkYS1saW5rIGJkYS1saW5rLXdlYnNpdGVcIiwgdGFyZ2V0OiBcIl9ibGFua1wifTtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJzdHJpbmdcIikgcHJvcHMuaHJlZiA9IHVybDtcclxuICAgICAgICBpZiAodHlwZW9mKHVybCkgPT0gXCJmdW5jdGlvblwiKSBwcm9wcy5vbkNsaWNrID0gKGV2ZW50KSA9PiB7ZXZlbnQucHJldmVudERlZmF1bHQoKTsgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IHVybCgpO307XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImFcIiwgcHJvcHMsIHRpdGxlKTtcclxuICAgIH1cclxuXHJcbiAgICBtYWtlQnV0dG9uKHRpdGxlLCBjaGlsZHJlbiwgYWN0aW9uKSB7XHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCBjb2xvcj1cImJsYWNrXCIgc2lkZT1cInRvcFwiIHRleHQ9e3RpdGxlfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1hZGRvbi1idXR0b25cIiBvbkNsaWNrPXthY3Rpb259PntjaGlsZHJlbn08L2Rpdj5cclxuICAgICAgICA8L1Rvb2x0aXBXcmFwPjtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaW5rcygpIHtcclxuICAgICAgICBjb25zdCBsaW5rcyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGFkZG9uID0gdGhpcy5wcm9wcy5hZGRvbjtcclxuICAgICAgICBpZiAoYWRkb24ud2Vic2l0ZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiV2Vic2l0ZVwiLCBhZGRvbi53ZWJzaXRlKSk7XHJcbiAgICAgICAgaWYgKGFkZG9uLnNvdXJjZSkgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU291cmNlXCIsIGFkZG9uLnNvdXJjZSkpO1xyXG4gICAgICAgIGlmIChhZGRvbi5pbnZpdGUpIHtcclxuICAgICAgICAgICAgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiU3VwcG9ydCBTZXJ2ZXJcIiwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdGVzdGVyID0gL1xcLmdnXFwvKC4qKSQvO1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvZGUgPSBhZGRvbi5pbnZpdGU7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdGVyLnRlc3QoY29kZSkpIGNvZGUgPSBjb2RlLm1hdGNoKHRlc3RlcilbMV07XHJcbiAgICAgICAgICAgICAgICBCRFYyLkxheWVyU3RhY2sucG9wTGF5ZXIoKTtcclxuICAgICAgICAgICAgICAgIEJEVjIuSW52aXRlQWN0aW9ucy5hY2NlcHRJbnZpdGVBbmRUcmFuc2l0aW9uVG9JbnZpdGVDaGFubmVsKGNvZGUpO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChhZGRvbi5kb25hdGUpIGxpbmtzLnB1c2godGhpcy5tYWtlTGluayhcIkRvbmF0ZVwiLCBhZGRvbi5kb25hdGUpKTtcclxuICAgICAgICBpZiAoYWRkb24ucGF0cmVvbikgbGlua3MucHVzaCh0aGlzLm1ha2VMaW5rKFwiUGF0cmVvblwiLCBhZGRvbi5wYXRyZW9uKSk7XHJcbiAgICAgICAgcmV0dXJuIGxpbmtzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBmb290ZXIoKSB7XHJcbiAgICAgICAgY29uc3QgbGlua3MgPSB0aGlzLmxpbmtzO1xyXG4gICAgICAgIHJldHVybiAobGlua3MubGVuZ3RoIHx8IHRoaXMuaGFzU2V0dGluZ3MpICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQtZm9vdGVyIGJkYS1mb290ZXJcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1saW5rcyBiZGEtbGlua3NcIn0sXHJcbiAgICAgICAgICAgICAgICAuLi4obGlua3MubWFwKChlbGVtZW50LCBpbmRleCkgPT4gaW5kZXggPCBsaW5rcy5sZW5ndGggLSAxID8gW2VsZW1lbnQsIFwiIHwgXCJdIDogZWxlbWVudCkuZmxhdCgpKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmhhc1NldHRpbmdzICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImJ1dHRvblwiLCB7b25DbGljazogdGhpcy5zaG93U2V0dGluZ3MsIGNsYXNzTmFtZTogXCJiZC1idXR0b24gYmRhLXNldHRpbmdzLWJ1dHRvblwiLCBkaXNhYmxlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0sIFwiU2V0dGluZ3NcIilcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2hhbmdlKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMudG9nZ2xlICYmIHRoaXMucHJvcHMudG9nZ2xlKHRoaXMubmFtZSk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Y2hlY2tlZDogIXRoaXMuc3RhdGUuY2hlY2tlZH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGVkaXQoKSB7dGhpcy5wcm9wcy5lZGl0KHRoaXMubmFtZSk7fVxyXG4gICAgZGVsZXRlKCkge3RoaXMucHJvcHMucmVtb3ZlKHRoaXMubmFtZSk7fVxyXG4gICAgcmVsb2FkKCkge3RoaXMucHJvcHMucmVsb2FkKHRoaXMubmFtZSk7fVxyXG5cclxuICAgIGdldCBuYW1lKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldE5hbWUoKSA6IHRoaXMucHJvcHMuYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0IGF1dGhvcigpIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcodGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4gPyB0aGlzLnByb3BzLmFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IHRoaXMucHJvcHMuYWRkb24uYXV0aG9yKTt9XHJcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKHRoaXMucHJvcHMuYWRkb24ucGx1Z2luID8gdGhpcy5wcm9wcy5hZGRvbi5wbHVnaW4uZ2V0RGVzY3JpcHRpb24oKSA6IHRoaXMucHJvcHMuYWRkb24uZGVzY3JpcHRpb24pO31cclxuICAgIGdldCB2ZXJzaW9uKCkge3JldHVybiB0aGlzLmdldFN0cmluZyh0aGlzLnByb3BzLmFkZG9uLnBsdWdpbiA/IHRoaXMucHJvcHMuYWRkb24ucGx1Z2luLmdldFZlcnNpb24oKSA6IHRoaXMucHJvcHMuYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZXR0aW5ncykgcmV0dXJuIHRoaXMuc2V0dGluZ3NDb21wb25lbnQ7XHJcbiAgICAgICAgY29uc3Qge2F1dGhvcklkLCBhdXRob3JMaW5rfSA9IHRoaXMucHJvcHMuYWRkb247XHJcblxyXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge31cclxuICAgICAgICBpZihzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNlwiXSl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmlzU2Nhbm5pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1NjYW5uaW5nID0gdHJ1ZVxyXG4gICAgICAgICAgICAgICAgcHJvY2Vzc0ZpbGUocmVzb2x2ZSh0aGlzLnByb3BzLmFkZG9uLmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSA/IGNvbnRlbnRNYW5hZ2VyLnBsdWdpbnNGb2xkZXIgOiBjb250ZW50TWFuYWdlci50aGVtZXNGb2xkZXIsIHRoaXMucHJvcHMuYWRkb24uZmlsZW5hbWUpLCAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy51bm1vdW50ZWQpcmV0dXJuXHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiByZXN1bHQuc3VzcGVjdCA/IFwic3VzcGVjdFwiIDogdHJ1ZVxyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICB9LCAoKSA9PiB7fSlcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLnN0YXRlLmlzVHJ1c3RlZCA9PT0gdHJ1ZSl7XHJcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuYm9yZGVyQ29sb3IgPSBcIiM0MDg3ZWRcIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYodGhpcy5zdGF0ZS5pc1RydXN0ZWQgPT09IFwic3VzcGVjdFwiKXtcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZS5ib3JkZXJDb2xvciA9IFwicmdiKDI0MCwgNzEsIDcxKVwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLWNhcmQgYmQtYWRkb24tY2FyZCBzZXR0aW5ncy1jbG9zZWQgdWktc3dpdGNoLWl0ZW1cIiwgc3R5bGV9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1hZGRvbi1oZWFkZXIgYmRhLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJiZC1jYXJkLXRpdGxlIGJkYS1oZWFkZXItdGl0bGVcIn0sIHRoaXMuYnVpbGRUaXRsZSh0aGlzLm5hbWUsIHRoaXMudmVyc2lvbiwge25hbWU6IHRoaXMuYXV0aG9yLCBpZDogYXV0aG9ySWQsIGxpbms6IGF1dGhvckxpbmt9KSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtYWRkb24tY29udHJvbHMgYmRhLWNvbnRyb2xzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLmVkaXQgJiYgdGhpcy5tYWtlQnV0dG9uKFwiRWRpdFwiLCA8RWRpdEljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmVkaXQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnJlbW92ZSAmJiB0aGlzLm1ha2VCdXR0b24oXCJEZWxldGVcIiwgPERlbGV0ZUljb24gY2xhc3NOYW1lPVwiYmQtaWNvblwiIC8+LCB0aGlzLmRlbGV0ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucmVsb2FkICYmIHRoaXMubWFrZUJ1dHRvbihcIlJlbG9hZFwiLCA8UmVsb2FkSWNvbiBjbGFzc05hbWU9XCJiZC1pY29uXCIgLz4sIHRoaXMucmVsb2FkKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChTd2l0Y2gsIHtvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogdGhpcy5zdGF0ZS5jaGVja2VkfSlcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImJkLXNjcm9sbGVyLXdyYXAgYmRhLWRlc2NyaXB0aW9uLXdyYXAgc2Nyb2xsZXItd3JhcCBmYWRlXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiYmQtc2Nyb2xsZXIgYmQtYWRkb24tZGVzY3JpcHRpb24gYmRhLWRlc2NyaXB0aW9uIHNjcm9sbGVyXCJ9LCB0aGlzLmRlc2NyaXB0aW9uKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICB0aGlzLmZvb3RlclxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmNvbnN0IG9yaWdpbmFsUmVuZGVyID0gVjJDX1BsdWdpbkNhcmQucHJvdG90eXBlLnJlbmRlcjtcclxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFYyQ19QbHVnaW5DYXJkLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7IiwiaW1wb3J0IEVycm9yQm91bmRhcnkgZnJvbSBcIi4vZXJyb3JCb3VuZGFyeVwiO1xyXG5pbXBvcnQgQ29udGVudENvbHVtbiBmcm9tIFwiLi9jb250ZW50Q29sdW1uXCI7XHJcbmltcG9ydCBSZWxvYWRJY29uIGZyb20gXCIuL3JlbG9hZEljb25cIjtcclxuaW1wb3J0IEFkZG9uQ2FyZCBmcm9tIFwiLi9hZGRvbmNhcmRcIjtcclxuaW1wb3J0IERyb3Bkb3duIGZyb20gXCIuL2NvbXBvbmVudHMvZHJvcGRvd25cIjtcclxuaW1wb3J0IFNlYXJjaCBmcm9tIFwiLi9jb21wb25lbnRzL3NlYXJjaFwiO1xyXG5cclxuaW1wb3J0IHtzZXR0aW5nc0Nvb2tpZSwgcGx1Z2luQ29va2llLCB0aGVtZUNvb2tpZSwgYmRwbHVnaW5zLCBiZHRoZW1lc30gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDb250ZW50TWFuYWdlciBmcm9tIFwiLi4vbW9kdWxlcy9jb250ZW50TWFuYWdlclwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgcGx1Z2luTW9kdWxlIGZyb20gXCIuLi9tb2R1bGVzL3BsdWdpbk1vZHVsZVwiO1xyXG5pbXBvcnQgdGhlbWVNb2R1bGUgZnJvbSBcIi4uL21vZHVsZXMvdGhlbWVNb2R1bGVcIjtcclxuaW1wb3J0IFdlYnBhY2tNb2R1bGVzIGZyb20gXCIuLi9tb2R1bGVzL3dlYnBhY2tNb2R1bGVzXCI7XHJcbmltcG9ydCBCZEFwaSBmcm9tIFwiLi4vbW9kdWxlcy9iZEFwaVwiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIjtcclxuaW1wb3J0IFRvb2x0aXBXcmFwIGZyb20gXCIuL3Rvb2x0aXBXcmFwXCI7XHJcbmltcG9ydCBiZEV2ZW50cyBmcm9tIFwiLi4vbW9kdWxlcy9iZEV2ZW50c1wiO1xyXG5pbXBvcnQgRW11bGF0ZWRUb29sdGlwIGZyb20gXCIuL3Rvb2x0aXBcIjtcclxuXHJcbmNvbnN0IFRvb2x0aXAgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlEaXNwbGF5TmFtZShcIlRvb2x0aXBcIik7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIucmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXJkTGlzdCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtzb3J0OiBcIm5hbWVcIiwgYXNjZW5kaW5nOiB0cnVlLCBxdWVyeTogXCJcIn07XHJcbiAgICAgICAgdGhpcy5pc1BsdWdpbnMgPSB0aGlzLnByb3BzLnR5cGUgPT0gXCJwbHVnaW5zXCI7XHJcbiAgICAgICAgdGhpcy5jb29raWUgPSB0aGlzLmlzUGx1Z2lucyA/IHBsdWdpbkNvb2tpZSA6IHRoZW1lQ29va2llO1xyXG4gICAgICAgIHRoaXMubWFuYWdlciA9IHRoaXMuaXNQbHVnaW5zID8gcGx1Z2luTW9kdWxlIDogdGhlbWVNb2R1bGU7XHJcblxyXG4gICAgICAgIHRoaXMuc29ydCA9IHRoaXMuc29ydC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMucmV2ZXJzZSA9IHRoaXMucmV2ZXJzZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoID0gdGhpcy5zZWFyY2guYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5vbkFkZG9uQ2hhbmdlcyA9IGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm9uQWRkb25DaGFuZ2VzID0gdGhpcy5vbkFkZG9uQ2hhbmdlcy5iaW5kKHRoaXMpXHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKXtcclxuICAgICAgICBjb25zdCB0eXBlID0gKHRoaXMuaXNQbHVnaW5zID8gXCJwbHVnaW5cIiA6IFwidGhlbWVcIikgKyBcIi1cIlxyXG4gICAgICAgIGJkRXZlbnRzLm9uKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXVubG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vbihgJHt0eXBlfXJlbG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsVW5tb3VudCgpe1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSAodGhpcy5pc1BsdWdpbnMgPyBcInBsdWdpblwiIDogXCJ0aGVtZVwiKSArIFwiLVwiXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9bG9hZGVkYCwgdGhpcy5vbkFkZG9uQ2hhbmdlcylcclxuICAgICAgICBiZEV2ZW50cy5vZmYoYCR7dHlwZX11bmxvYWRlZGAsIHRoaXMub25BZGRvbkNoYW5nZXMpXHJcbiAgICAgICAgYmRFdmVudHMub2ZmKGAke3R5cGV9cmVsb2FkZWRgLCB0aGlzLm9uQWRkb25DaGFuZ2VzKVxyXG4gICAgfVxyXG5cclxuICAgIG9wZW5Gb2xkZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2hlbGwgPSByZXF1aXJlKFwiZWxlY3Ryb25cIikuc2hlbGw7XHJcbiAgICAgICAgY29uc3Qgb3BlbiA9IHNoZWxsLm9wZW5QYXRoIHx8IHNoZWxsLm9wZW5JdGVtO1xyXG4gICAgICAgIG9wZW4odGhpcy5pc1BsdWdpbnMgPyBDb250ZW50TWFuYWdlci5wbHVnaW5zRm9sZGVyIDogQ29udGVudE1hbmFnZXIudGhlbWVzRm9sZGVyKTtcclxuICAgIH1cclxuXHJcbiAgICBlZGl0KG5hbWUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhuYW1lKTtcclxuICAgICAgICB0aGlzLm1hbmFnZXIuZWRpdChuYW1lKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGUobmFtZSkge1xyXG4gICAgICAgIGNvbnN0IHNob3VsZERlbGV0ZSA9IGF3YWl0IHRoaXMuY29uZmlybURlbGV0ZShuYW1lKTtcclxuICAgICAgICBpZiAoIXNob3VsZERlbGV0ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMubWFuYWdlci5kZWxldGUobmFtZSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uZmlybURlbGV0ZShuYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgICAgICBCZEFwaS5zaG93Q29uZmlybWF0aW9uTW9kYWwoXCJBcmUgWW91IFN1cmU/XCIsIGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlICR7bmFtZX0/YCwge1xyXG4gICAgICAgICAgICAgICAgZGFuZ2VyOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgY29uZmlybVRleHQ6IFwiRGVsZXRlXCIsXHJcbiAgICAgICAgICAgICAgICBvbkNvbmZpcm06ICgpID0+IHtyZXNvbHZlKHRydWUpO30sXHJcbiAgICAgICAgICAgICAgICBvbkNhbmNlbDogKCkgPT4ge3Jlc29sdmUoZmFsc2UpO31cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcHRpb25zKCkge1xyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJOYW1lXCIsIHZhbHVlOiBcIm5hbWVcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJBdXRob3JcIiwgdmFsdWU6IFwiYXV0aG9yXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiVmVyc2lvblwiLCB2YWx1ZTogXCJ2ZXJzaW9uXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiUmVjZW50bHkgQWRkZWRcIiwgdmFsdWU6IFwiYWRkZWRcIn0sXHJcbiAgICAgICAgICAgIHtsYWJlbDogXCJMYXN0IE1vZGlmaWVkXCIsIHZhbHVlOiBcIm1vZGlmaWVkXCJ9LFxyXG4gICAgICAgICAgICB7bGFiZWw6IFwiRmlsZSBTaXplXCIsIHZhbHVlOiBcInNpemVcIn0sXHJcbiAgICAgICAgXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGlyZWN0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1xyXG4gICAgICAgICAgICB7bGFiZWw6IFwiQXNjZW5kaW5nXCIsIHZhbHVlOiB0cnVlfSxcclxuICAgICAgICAgICAge2xhYmVsOiBcIkRlc2NlbmRpbmdcIiwgdmFsdWU6IGZhbHNlfVxyXG4gICAgICAgIF07XHJcbiAgICB9XHJcblxyXG4gICAgcmV2ZXJzZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2FzY2VuZGluZzogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzb3J0KHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7c29ydDogdmFsdWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2goZXZlbnQpIHtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtxdWVyeTogZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG9jYWxlTG93ZXJDYXNlKCl9KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcm9wcyhhZGRvbikge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGtleTogdGhpcy5nZXROYW1lKGFkZG9uKSxcclxuICAgICAgICAgICAgZW5hYmxlZDogdGhpcy5jb29raWVbdGhpcy5nZXROYW1lKGFkZG9uKV0sXHJcbiAgICAgICAgICAgIHRvZ2dsZTogdGhpcy5tYW5hZ2VyLnRvZ2dsZS5iaW5kKHRoaXMubWFuYWdlciksXHJcbiAgICAgICAgICAgIGVkaXQ6IHNldHRpbmdzQ29va2llW1wiZm9yay1wcy03XCJdID8gdGhpcy5lZGl0LmJpbmQodGhpcykgOiBudWxsLFxyXG4gICAgICAgICAgICByZW1vdmU6IHRoaXMuZGVsZXRlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIGFkZG9uOiBhZGRvbixcclxuICAgICAgICAgICAgaGFzaDogYWRkb24uaGFzaFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RyaW5nKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIFwiPz8/XCI7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInN0cmluZ1wiID8gdmFsdWUgOiB2YWx1ZS50b1N0cmluZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsaXN0KCl7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvcHMudHlwZSA9PT0gXCJwbHVnaW5zXCIgPyBPYmplY3QudmFsdWVzKGJkcGx1Z2lucykgOiBPYmplY3QudmFsdWVzKGJkdGhlbWVzKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBZGRvbnMoKSB7XHJcbiAgICAgICAgY29uc3Qgc29ydGVkQWRkb25zID0gdGhpcy5saXN0LnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgY2FwID0gdGhpcy5zdGF0ZS5zb3J0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGhpcy5zdGF0ZS5zb3J0LnNsaWNlKDEpO1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGEucGx1Z2luICYmIGEucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGEucGx1Z2luW2BnZXQke2NhcH1gXSgpKSA6IHRoaXMuZ2V0U3RyaW5nKGFbdGhpcy5zdGF0ZS5zb3J0XSk7XHJcbiAgICAgICAgICAgIGNvbnN0IHNlY29uZCA9IGIucGx1Z2luICYmIGIucGx1Z2luW2BnZXQke2NhcH1gXSA/IHRoaXMuZ2V0U3RyaW5nKGIucGx1Z2luW2BnZXQke2NhcH1gXSgpKSAgOiB0aGlzLmdldFN0cmluZyhiW3RoaXMuc3RhdGUuc29ydF0pO1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mKGZpcnN0KSA9PSBcInN0cmluZ1wiKSByZXR1cm4gZmlyc3QudG9Mb2NhbGVMb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKHNlY29uZC50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcclxuICAgICAgICAgICAgaWYgKGZpcnN0ID4gc2Vjb25kKSByZXR1cm4gMTtcclxuICAgICAgICAgICAgaWYgKHNlY29uZCA+IGZpcnN0KSByZXR1cm4gLTE7XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5hc2NlbmRpbmcpIHNvcnRlZEFkZG9ucy5yZXZlcnNlKCk7XHJcbiAgICAgICAgY29uc3QgcmVuZGVyZWQgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBhID0gMDsgYSA8IHNvcnRlZEFkZG9ucy5sZW5ndGg7IGErKykge1xyXG4gICAgICAgICAgICBjb25zdCBhZGRvbiA9IHNvcnRlZEFkZG9uc1thXTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUucXVlcnkpIHtcclxuICAgICAgICAgICAgICAgIGxldCBtYXRjaGVzID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldE5hbWUoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYXV0aG9yID0gdGhpcy5nZXRBdXRob3IoYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0aGlzLmdldERlc2NyaXB0aW9uKGFkZG9uKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZlcnNpb24gPSB0aGlzLmdldFZlcnNpb24oYWRkb24pO1xyXG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIG1hdGNoZXMgPSBuYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYXV0aG9yKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCBhdXRob3IudG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbikgbWF0Y2hlcyA9IG1hdGNoZXMgfHwgZGVzY3JpcHRpb24udG9Mb2NhbGVMb3dlckNhc2UoKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnF1ZXJ5KTtcclxuICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uKSBtYXRjaGVzID0gbWF0Y2hlcyB8fCB2ZXJzaW9uLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXModGhpcy5zdGF0ZS5xdWVyeSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZXMpIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHByb3BzID0gdGhpcy5nZXRQcm9wcyhhZGRvbik7XHJcbiAgICAgICAgICAgIHJlbmRlcmVkLnB1c2goPEVycm9yQm91bmRhcnk+PEFkZG9uQ2FyZCB7Li4ucHJvcHN9IHJlbG9hZD17IXNldHRpbmdzQ29va2llW1wiZm9yay1wcy01XCJdICYmIHRoaXMubWFuYWdlci5yZWxvYWQuYmluZCh0aGlzLm1hbmFnZXIpfSAvPjwvRXJyb3JCb3VuZGFyeT4pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVuZGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0TmFtZShhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0TmFtZSgpIDogYWRkb24ubmFtZSk7fVxyXG4gICAgZ2V0QXV0aG9yKGFkZG9uKSB7cmV0dXJuIHRoaXMuZ2V0U3RyaW5nKGFkZG9uLnBsdWdpbiA/IGFkZG9uLnBsdWdpbi5nZXRBdXRob3IoKSA6IGFkZG9uLmF1dGhvcik7fVxyXG4gICAgZ2V0RGVzY3JpcHRpb24oYWRkb24pIHtyZXR1cm4gdGhpcy5nZXRTdHJpbmcoYWRkb24ucGx1Z2luID8gYWRkb24ucGx1Z2luLmdldERlc2NyaXB0aW9uKCkgOiBhZGRvbi5kZXNjcmlwdGlvbik7fVxyXG4gICAgZ2V0VmVyc2lvbihhZGRvbikge3JldHVybiB0aGlzLmdldFN0cmluZyhhZGRvbi5wbHVnaW4gPyBhZGRvbi5wbHVnaW4uZ2V0VmVyc2lvbigpIDogYWRkb24udmVyc2lvbik7fVxyXG5cclxuICAgIHJlbmRlckNoZWNrVXBkYXRlcygpe1xyXG4gICAgICAgIGlmKCF3aW5kb3cuWmVyZXNQbHVnaW5MaWJyYXJ5KXJldHVybiBudWxsXHJcbiAgICAgICAgaWYoIXdpbmRvdy5QbHVnaW5VcGRhdGVzKXJldHVybiBudWxsXHJcbiAgICAgICAgaWYodHlwZW9mIHdpbmRvdy5QbHVnaW5VcGRhdGVzLmNoZWNrQWxsICE9PSBcImZ1bmN0aW9uXCIpcmV0dXJuIG51bGxcclxuICAgICAgICBpZighdGhpcy5pc1BsdWdpbnMpcmV0dXJuIG51bGxcclxuXHJcbiAgICAgICAgbGV0IHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxyXG4gICAgICAgIGxldCB0b29sdGlwXHJcbiAgICAgICAgcmV0dXJuIDxUb29sdGlwV3JhcCB0ZXh0PVwiQ2hlY2tzIGZvciB1cGRhdGVzIG9mIHBsdWdpbnMgdGhhdCBzdXBwb3J0IHRoaXMgZmVhdHVyZS4gUmlnaHQtY2xpY2sgZm9yIGEgbGlzdC5cIj5cclxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9e3ttYXJnaW5MZWZ0OiBcIjEwcHhcIn19IG9uTW91c2VMZWF2ZT17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXBJc1Nob3dpbmcgPSBmYWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAuaGlkZSgpXHJcbiAgICAgICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxMaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLkJ1dHRvbiByZWY9XCJjaGVja1VwZGF0ZUJ1dHRvblwiIGNvbG9yPVwiYnJhbmRcIiBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuc2hvd1RvYXN0KFwiUGx1Z2luIHVwZGF0ZSBjaGVjayBpbiBwcm9ncmVzcy5cIiwge3R5cGU6IFwiaW5mb1wifSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LlBsdWdpblVwZGF0ZXMuY2hlY2tBbGwoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJQbHVnaW4gdXBkYXRlIGNoZWNrIGNvbXBsZXRlLlwiLCB7dHlwZTogXCJzdWNjZXNzXCJ9KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkIHdoaWxlIGNoZWNraW5nIHVwZGF0ZS5cIiwge3R5cGU6IFwiZXJyb3JcIn0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfWNhdGNoKGUpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLnNob3dUb2FzdChcIkFuIGVycm9yIG9jY3VyZWQgd2hpbGUgY2hlY2tpbmcgdXBkYXRlLlwiLCB7dHlwZTogXCJlcnJvclwifSlcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9fSB3cmFwcGVyPXtmYWxzZX0gZGlzYWJsZWQ9e2ZhbHNlfSBvblJpZ2h0Q2xpY2s9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5yZWZzLmNoZWNrVXBkYXRlQnV0dG9uKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LlBsdWdpblVwZGF0ZXMgfHwgIXdpbmRvdy5QbHVnaW5VcGRhdGVzLnBsdWdpbnMpIHJldHVybjtcclxuICAgICAgICAgICAgICAgICAgICBpZih0b29sdGlwSXNTaG93aW5nKXJldHVyblxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAgPSBuZXcgRW11bGF0ZWRUb29sdGlwKHRoaXMucmVmcy5jaGVja1VwZGF0ZUJ1dHRvbi5yZWZzLm9yaWdpbmFsLnJlZnMuYnV0dG9uLCBPYmplY3QudmFsdWVzKHdpbmRvdy5QbHVnaW5VcGRhdGVzLnBsdWdpbnMpLm1hcChwID0+IHAubmFtZSkuam9pbihcIiwgXCIpLCB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZGU6IFwiYm90dG9tXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaEV2ZW50czogZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXAuc2hvdygpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcElzU2hvd2luZyA9IHRydWVcclxuICAgICAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgICAgIENoZWNrIGZvciBVcGRhdGVzXHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9Ub29sdGlwV3JhcD5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3QgcmVmcmVzaEljb24gPSA8VG9vbHRpcCBjb2xvcj1cImJsYWNrXCIgcG9zaXRpb249XCJ0b3BcIiB0ZXh0PVwiUmVsb2FkIExpc3RcIj5cclxuICAgICAgICAgICAgeyhwcm9wcykgPT4gXHJcbiAgICAgICAgICAgIDxSZWxvYWRJY29uIHsuLi5wcm9wc30gY2xhc3NOYW1lPVwiYmQtaWNvbiBiZC1yZWxvYWQgYmQtcmVsb2FkLWhlYWRlclwiIHNpemU9XCIxOHB4XCIgb25DbGljaz17YXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNQbHVnaW5zKSBwbHVnaW5Nb2R1bGUudXBkYXRlUGx1Z2luTGlzdCgpO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB0aGVtZU1vZHVsZS51cGRhdGVUaGVtZUxpc3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcclxuICAgICAgICAgICAgfX0gLz5cclxuICAgICAgICAgICAgfTwvVG9vbHRpcD47XHJcbiAgICAgICAgY29uc3QgYWRkb25DYXJkcyA9IHRoaXMuZ2V0QWRkb25zKCk7XHJcblxyXG4gICAgICAgIHJldHVybiA8Q29udGVudENvbHVtbiB0aXRsZT17YCR7dGhpcy5wcm9wcy50eXBlLnRvVXBwZXJDYXNlKCl94oCUJHthZGRvbkNhcmRzLmxlbmd0aH1gfT5cclxuICAgICAgICAgICAgPExpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uIGtleT1cImZvbGRlci1idXR0b25cIiBjb2xvcj1cImJyYW5kXCIgXHJcbiAgICAgICAgICAgICAgICBsb29rPVwiZmlsbGVkXCIgc2l6ZT1cIm1pblwiIGhvdmVyQ29sb3I9XCJkZWZhdWx0XCIgb25DbGljaz17dGhpcy5vcGVuRm9sZGVyLmJpbmQodGhpcyl9IHdyYXBwZXI9e2ZhbHNlfVxyXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIlxyXG4gICAgICAgICAgICAgICAgfX0+XHJcbiAgICAgICAgICAgICAgICBPcGVuIHt0aGlzLmlzUGx1Z2lucyA/IFwiUGx1Z2luXCIgOiBcIlRoZW1lXCJ9IEZvbGRlclxyXG4gICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICB7dGhpcy5yZW5kZXJDaGVja1VwZGF0ZXMoKX1cclxuICAgICAgICAgICAgeyFzZXR0aW5nc0Nvb2tpZVtcImZvcmstcHMtNVwiXSAmJiByZWZyZXNoSWNvbn1cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1jb250cm9scyBiZC1hZGRvbi1jb250cm9sc1wiPlxyXG4gICAgICAgICAgICAgICAgPFNlYXJjaCBvbkNoYW5nZT17dGhpcy5zZWFyY2h9IHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7dGhpcy5wcm9wcy50eXBlfS4uLmB9IC8+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLWFkZG9uLWRyb3Bkb3duc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBwZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+U29ydCBieTo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5zb3J0T3B0aW9uc30gb25DaGFuZ2U9e3RoaXMuc29ydH0gc3R5bGU9XCJ0cmFuc3BhcmVudFwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3Qtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmQtbGFiZWxcIj5PcmRlcjo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8RHJvcGRvd24gb3B0aW9ucz17dGhpcy5kaXJlY3Rpb25zfSBvbkNoYW5nZT17dGhpcy5yZXZlcnNlfSBzdHlsZT1cInRyYW5zcGFyZW50XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZGEtc2xpc3QgYmQtYWRkb24tbGlzdFwiPnthZGRvbkNhcmRzfTwvZGl2PlxyXG4gICAgICAgIDwvQ29udGVudENvbHVtbj5cclxuICAgIH1cclxufVxyXG5cclxuY29uc3Qgb3JpZ2luYWxSZW5kZXIgPSBDYXJkTGlzdC5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQ2FyZExpc3QucHJvdG90eXBlLCBcInJlbmRlclwiLCB7XHJcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcclxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcbiAgICBzZXQ6IGZ1bmN0aW9uKCkge2NvbnNvbGUud2FybihcIkFkZG9uIHBvbGljeSBmb3IgcGx1Z2lucyAjNSBodHRwczovL2dpdGh1Yi5jb20vcmF1ZW56aS9CZXR0ZXJEaXNjb3JkQXBwL3dpa2kvQWRkb24tUG9saWNpZXMjcGx1Z2luc1wiKTt9LFxyXG4gICAgZ2V0OiAoKSA9PiBvcmlnaW5hbFJlbmRlclxyXG59KTsiLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQkRMb2dvIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJzdmdcIixcclxuICAgICAgICAgICAge2hlaWdodDogXCIxMDAlXCIsIHdpZHRoOiB0aGlzLnByb3BzLnNpemUgfHwgXCIxNnB4XCIsIGNsYXNzTmFtZTogXCJiZC1sb2dvIFwiICsgdGhpcy5wcm9wcy5jbGFzc05hbWUsIHN0eWxlOiB7ZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLCBjbGlwUnVsZTogXCJldmVub2RkXCIsIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIiwgc3Ryb2tlTGluZWpvaW46IFwicm91bmRcIn0sIHZpZXdCb3g6IFwiMCAwIDIwMDAgMjAwMFwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwibWV0YWRhdGFcIiwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRlZnNcIiwgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZpbHRlclwiLCB7aWQ6IFwic2hhZG93MVwifSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmVEcm9wU2hhZG93XCIsIHtcImR4XCI6IFwiMjBcIiwgXCJkeVwiOiBcIjBcIiwgXCJzdGREZXZpYXRpb25cIjogXCIyMFwiLCBcImZsb29kLWNvbG9yXCI6IFwicmdiYSgwLDAsMCwwLjM1KVwifSkpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZmlsdGVyXCIsIHtpZDogXCJzaGFkb3cyXCJ9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmZURyb3BTaGFkb3dcIiwge1wiZHhcIjogXCIxNVwiLCBcImR5XCI6IFwiMFwiLCBcInN0ZERldmlhdGlvblwiOiBcIjIwXCIsIFwiZmxvb2QtY29sb3JcIjogXCJyZ2JhKDI1NSwyNTUsMjU1LDAuMTUpXCJ9KSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJmaWx0ZXJcIiwge2lkOiBcInNoYWRvdzNcIn0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImZlRHJvcFNoYWRvd1wiLCB7XCJkeFwiOiBcIjEwXCIsIFwiZHlcIjogXCIwXCIsIFwic3RkRGV2aWF0aW9uXCI6IFwiMjBcIiwgXCJmbG9vZC1jb2xvclwiOiBcInJnYmEoMCwwLDAsMC4zNSlcIn0pKVxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJnXCIsIG51bGwsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzMpXCJ9LCBkOiBcIk0xMTk1LjQ0KzEzNS40NDJMMTE5NS40NCsxMzUuNDQyTDk5Ny42KzEzNi40NDJDMTAyNC4yKzE0OS43NDIrMTE3MC4zNCsxNjMuNTQyKzExOTMuNjQrMTc5Ljc0MkMxMjY0LjM0KzIyOC44NDIrMTMxOS43NCsyOTEuMjQyKzEzNTguMjQrMzY1LjA0MkMxMzk4LjE0KzQ0MS42NDIrMTQxOS43NCs1MzAuNjQyKzE0MjIuNTQrNjI5LjY0MkwxNDIyLjU0KzYzMC44NDJMMTQyMi41NCs2MzIuMDQyQzE0MjIuNTQrNzczLjE0MisxNDIyLjU0KzEyMjguMTQrMTQyMi41NCsxMzY5LjE0TDE0MjIuNTQrMTM3MC4zNEwxNDIyLjU0KzEzNzEuNTRDMTQxOS44NCsxNDcwLjU0KzEzOTguMjQrMTU1OS41NCsxMzU4LjI0KzE2MzYuMTRDMTMxOS43NCsxNzA5Ljk0KzEyNjQuNDQrMTc3Mi4zNCsxMTkzLjY0KzE4MjEuNDRDMTE3MS4wNCsxODM3LjE0KzEwMjUuNysxODUwLjU0KzEwMDArMTg2My41NEwxMTkzLjU0KzE4NjQuNTRDMTUzOS43NCsxODY2LjQ0KzE4NjQuNTQrMTY5My4zNCsxODY0LjU0KzEyOTYuNjRMMTg2NC41NCs3MTYuOTQyQzE4NjYuNDQrMzEyLjQ0MisxNTQxLjY0KzEzNS40NDIrMTE5NS40NCsxMzUuNDQyWlwiLCBmaWxsOiBcIiMxNzE3MTdcIiwgb3BhY2l0eTogXCIxXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge3N0eWxlOiB7ZmlsdGVyOiBcInVybCgjc2hhZG93MilcIn0sIGQ6IFwiTTE2OTUuNTQrNjMxLjQ0MkMxNjg1Ljg0KzI3OC4wNDIrMTQwOS4zNCsxMzUuNDQyKzEwNTIuOTQrMTM1LjQ0MkwzNjEuNzQrMTM2LjQ0Mkw4MDMuNzQrNDkwLjQ0MkwxMDYwLjc0KzQ5MC40NDJDMTMzNS4yNCs0OTAuNDQyKzEzMzUuMjQrODM1LjM0MisxMDYwLjc0KzgzNS4zNDJMMTA2MC43NCsxMTY0Ljg0QzExNTAuMjIrMTE2NC44NCsxMjEwLjUzKzEyMDEuNDgrMTI0MS42OCsxMjUwLjg3QzEzMDYuMDcrMTM1MysxMjQ1Ljc2KzE1MDkuNjQrMTA2MC43NCsxNTA5LjY0TDM2MS43NCsxODYzLjU0TDEwNTIuOTQrMTg2NC41NEMxNDA5LjI0KzE4NjQuNTQrMTY4NS43NCsxNzIxLjk0KzE2OTUuNTQrMTM2OC41NEMxNjk1LjU0KzEyMDUuOTQrMTY1MS4wNCsxMDg0LjQ0KzE1NzIuNjQrOTk5Ljk0MkMxNjUxLjA0KzkxNS41NDIrMTY5NS41NCs3OTQuMDQyKzE2OTUuNTQrNjMxLjQ0MlpcIiwgZmlsbDogXCIjM0U4MkU1XCIsIG9wYWNpdHk6IFwiMVwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtzdHlsZToge2ZpbHRlcjogXCJ1cmwoI3NoYWRvdzEpXCJ9LCBkOiBcIk0xNDY5LjI1KzYzMS40NDJDMTQ1OS41NSsyNzguMDQyKzExODMuMDUrMTM1LjQ0Mis4MjYuNjUrMTM1LjQ0MkwxMzUuNDUrMTM1LjQ0MkwxMzUuNDUrMTAwNEMxMzUuNDUrMTAwNCsxMzUuNDI3KzEyNTUuMjErMzU1LjYyNisxMjU1LjIxQzU3NS44MjUrMTI1NS4yMSs1NzUuODQ4KzEwMDQrNTc1Ljg0OCsxMDA0TDU3Ny40NSs0OTAuNDQyTDgzNC40NSs0OTAuNDQyQzExMDguOTUrNDkwLjQ0MisxMTA4Ljk1KzgzNS4zNDIrODM0LjQ1KzgzNS4zNDJMNjY0LjY1KzgzNS4zNDJMNjY0LjY1KzExNjQuODRMODM0LjQ1KzExNjQuODRDOTIzLjkzMisxMTY0Ljg0Kzk4NC4yNDQrMTIwMS40OCsxMDE1LjM5KzEyNTAuODdDMTA3OS43OCsxMzUzKzEwMTkuNDcrMTUwOS42NCs4MzQuNDUrMTUwOS42NEwxMzUuNDUrMTUwOS42NEwxMzUuNDUrMTg2NC41NEw4MjYuNjUrMTg2NC41NEMxMTgyLjk1KzE4NjQuNTQrMTQ1OS40NSsxNzIxLjk0KzE0NjkuMjUrMTM2OC41NEMxNDY5LjI1KzEyMDUuOTQrMTQyNC43NSsxMDg0LjQ0KzEzNDYuMzUrOTk5Ljk0MkMxNDI0Ljc1KzkxNS41NDIrMTQ2OS4yNSs3OTQuMDQyKzE0NjkuMjUrNjMxLjQ0MlpcIiwgZmlsbDogXCIjRkZGRkZGXCIsIG9wYWNpdHk6IFwiMVwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX0NoZWNrYm94IGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLm9uQ2xpY2sgPSB0aGlzLm9uQ2xpY2suYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWQgfHwgZmFsc2VcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImxpXCIsXHJcbiAgICAgICAgICAgIG51bGwsXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94IFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3gsIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImNoZWNrYm94LWlubmVyIFwiK0JETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94SW5uZXIpWzBdLmNoZWNrYm94SW5uZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtjbGFzc05hbWU6IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoZWNrYm94RWxlbWVudClbMF0uY2hlY2tib3hFbGVtZW50LCBjaGVja2VkOiB0aGlzLnN0YXRlLmNoZWNrZWQsIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJjaGVja2JveFwifSksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3BhblwiLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudGV4dFxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodGhpcy5wcm9wcy5pZCwgIXRoaXMuc3RhdGUuY2hlY2tlZCk7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGNoZWNrZWQ6ICF0aGlzLnN0YXRlLmNoZWNrZWRcclxuICAgICAgICB9KTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBBcnJvdyBmcm9tIFwiLi4vaWNvbnMvZG93bmFycm93XCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7b3BlbjogZmFsc2UsIHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlIHx8IHRoaXMucHJvcHMub3B0aW9uc1swXS52YWx1ZX07XHJcbiAgICAgICAgdGhpcy5kcm9wZG93biA9IFJlYWN0LmNyZWF0ZVJlZigpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zaG93TWVudSA9IHRoaXMuc2hvd01lbnUuYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmhpZGVNZW51ID0gdGhpcy5oaWRlTWVudS5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dNZW51KGV2ZW50KSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtvcGVuOiB0cnVlfSwgKCkgPT4ge1xyXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5oaWRlTWVudSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaGlkZU1lbnUoKSB7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7b3BlbjogZmFsc2V9LCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLmhpZGVNZW51KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3ZhbHVlfSk7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DaGFuZ2UpIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWxlY3RlZCgpIHtyZXR1cm4gdGhpcy5wcm9wcy5vcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09IHRoaXMuc3RhdGUudmFsdWUpO31cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWQ7XHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LW9wdGlvbnNcIj5cclxuICAgICAgICAgICAge3RoaXMucHJvcHMub3B0aW9ucy5tYXAob3B0ID0+IFxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qtb3B0aW9uJHtzZWxlY3RlZC52YWx1ZSA9PSBvcHQudmFsdWUgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gfSBvbkNsaWNrPXt0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcywgb3B0LnZhbHVlKX0+e29wdC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgKX1cclxuICAgICAgICA8L2Rpdj47XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHN0eWxlID0gdGhpcy5wcm9wcy5zdHlsZSA9PSBcInRyYW5zcGFyZW50XCIgPyBcIiBiZC1zZWxlY3QtdHJhbnNwYXJlbnRcIiA6IFwiXCI7XHJcbiAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5zdGF0ZS5vcGVuID8gXCIgbWVudS1vcGVuXCIgOiBcIlwiO1xyXG4gICAgICAgIHJldHVybiAgPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJiZC1zZWxlY3QtdmFsdWVcIj57dGhpcy5zZWxlY3RlZC5sYWJlbH08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8QXJyb3cgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LWFycm93XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICB7dGhpcy5zdGF0ZS5vcGVuICYmIHRoaXMub3B0aW9uc31cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufVxyXG5cclxuLy8gcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXdyYXBcIj5cclxuLy8gPGxhYmVsIGNsYXNzTmFtZT1cImJkLWxhYmVsXCI+e3RoaXMucHJvcHMubGFiZWx9PC9sYWJlbD5cclxuLy8gPGRpdiBjbGFzc05hbWU9e2BiZC1zZWxlY3Qke3N0eWxlfSR7aXNPcGVufWB9IG9uQ2xpY2s9e3RoaXMuc2hvd01lbnV9IHJlZj17dGhpcy5kcm9wZG93bn0+XHJcbi8vICAgICA8ZGl2IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1jb250cm9sc1wiPlxyXG4vLyAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYmQtc2VsZWN0LXZhbHVlXCI+e3RoaXMuc2VsZWN0ZWQubGFiZWx9PC9kaXY+XHJcbi8vICAgICAgICAgPEFycm93IGNsYXNzTmFtZT1cImJkLXNlbGVjdC1hcnJvd1wiIC8+XHJcbi8vICAgICA8L2Rpdj5cclxuLy8gPC9kaXY+XHJcbi8vIHt0aGlzLnN0YXRlLm9wZW4gJiYgdGhpcy5vcHRpb25zfVxyXG4vLyA8L2Rpdj47IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFNlYXJjaEljb24gZnJvbSBcIi4uL2ljb25zL3NlYXJjaFwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBmb2N1c2VkOiBmYWxzZVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBbXCJiZC1zZWFyY2gtd3JhcHBlclwiXVxyXG4gICAgICAgIGlmKHRoaXMuc3RhdGUuZm9jdXNlZCljbGFzc05hbWUucHVzaChcImZvY3VzZWRcIilcclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZS5qb2luKFwiIFwiKX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfSBvbktleURvd249e3RoaXMucHJvcHMub25LZXlEb3dufSB0eXBlPVwidGV4dFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPXt0aGlzLnByb3BzLnBsYWNlaG9sZGVyfSBtYXhMZW5ndGg9XCI1MFwiIFxyXG4gICAgICAgICAgICAgICAgICAgIG9uRm9jdXM9eygpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Zm9jdXNlZDogdHJ1ZX0pXHJcbiAgICAgICAgICAgICAgICAgICAgfX0gb25CbHVyPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2ZvY3VzZWQ6IGZhbHNlfSlcclxuICAgICAgICAgICAgICAgICAgICB9fS8+XHJcbiAgICAgICAgICAgICAgICAgICAgPFNlYXJjaEljb24gLz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTd2l0Y2ggZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtjaGVja2VkOiB0aGlzLnByb3BzLmNoZWNrZWR9O1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zd2l0Y2ggPSA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5Td2l0Y2ggb25DaGFuZ2U9e3RoaXMub25DaGFuZ2V9IHZhbHVlPXt0aGlzLnN0YXRlLmNoZWNrZWR9IC8+XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucHJvcHMub25DaGFuZ2UodmFsdWUpO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2NoZWNrZWQ6IHZhbHVlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN3aXRjaFxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19Db250ZW50Q29sdW1uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0IGRpc3BsYXlOYW1lKCkge3JldHVybiBcIkNvbnRlbnRDb2x1bW5cIjt9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIC8vbGV0IGNvbnRlbnRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250ZW50Q29sdW1uKVswXVxyXG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMucHJvcHMudGl0bGUgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJoMlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGl0bGUgaDIgbWFyZ2luLXJlc2V0IG1hcmdpbi1ib3R0b20tMjBcIn0sIHRoaXMucHJvcHMudGl0bGUpIDogbnVsbFxyXG4gICAgICAgIHJldHVybiBbXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgXVxyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGNvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbiArIFwiIFwiK2NvbnRlbnRNb2R1bGUuY29udGVudENvbHVtbkRlZmF1bHQrXCIgY29udGVudC1jb2x1bW4gZGVmYXVsdFwiLCBzdHlsZToge3BhZGRpbmc6IFwiNjBweCA0MHB4IDBweFwifX0sXHJcbiAgICAgICAgICAgIHRpdGxlLFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLmNoaWxkcmVuXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgU2V0dGluZ3MgZnJvbSBcIi4uL21vZHVsZXMvc2V0dGluZ3NQYW5lbFwiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRGF0YVN0b3JlIGZyb20gXCIuLi9tb2R1bGVzL2RhdGFTdG9yZVwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiXHJcblxyXG5pbXBvcnQgU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBDaGVja2JveCBmcm9tIFwiLi9jaGVja2JveFwiO1xyXG5pbXBvcnQgVjJDX0Nzc0VkaXRvckRldGFjaGVkIGZyb20gXCIuL2Nzc0VkaXRvckRldGFjaGVkXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc2VsZi5wcm9wcy5saW5lcyA9IDA7XHJcbiAgICAgICAgc2VsZi5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICBzZWxmLmF0dGFjaCA9IHNlbGYuYXR0YWNoLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5kZXRhY2hlZEVkaXRvciA9IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChWMkNfQ3NzRWRpdG9yRGV0YWNoZWQsIHthdHRhY2g6IHNlbGYuYXR0YWNofSk7XHJcbiAgICAgICAgc2VsZi5vbkNsaWNrID0gc2VsZi5vbkNsaWNrLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi51cGRhdGVDc3MgPSBzZWxmLnVwZGF0ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuc2F2ZUNzcyA9IHNlbGYuc2F2ZUNzcy5iaW5kKHNlbGYpO1xyXG4gICAgICAgIHNlbGYuZGV0YWNoID0gc2VsZi5kZXRhY2guYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRoaXMucHJvcHMuZGV0YWNoZWQgfHwgQkRWMi5lZGl0b3JEZXRhY2hlZFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvclwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9kaXNjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHMsIHByZXZTdGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChwcmV2U3RhdGUuZGV0YWNoZWQgJiYgIXNlbGYuc3RhdGUuZGV0YWNoZWQpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHNlbGYuZGV0YWNoZWRSb290KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29kZU1pcnJvcigpIHtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gQnVmZmVyLmZyb20oX2Njc3MsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlTGluZUNvdW50KCkge1xyXG4gICAgICAgIGNvbnN0IGxpbmVDb3VudCA9IHRoaXMucmVmcy5lZGl0b3IudmFsdWUuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xyXG4gICAgICAgIGlmIChsaW5lQ291bnQgPT0gdGhpcy5wcm9wcy5saW5lcykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucmVmcy5saW5lcy50ZXh0Q29udGVudCA9IEFycmF5LmZyb20obmV3IEFycmF5KGxpbmVDb3VudCksIChfLCBpKSA9PiBpICsgMSkuam9pbihcIi5cXG5cIikgKyBcIi5cIjtcclxuICAgICAgICB0aGlzLnByb3BzLmxpbmVzID0gbGluZUNvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuXHJcbiAgICAgICAgY29uc3Qge2RldGFjaGVkfSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgZGV0YWNoZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJlZGl0b3ItZGV0YWNoZWRcIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IFwiQ3VzdG9tIENTUyBFZGl0b3JcIn0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiaDNcIixcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIFwiRWRpdG9yIERldGFjaGVkXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICFkZXRhY2hlZCAmJiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7dGV4dDogXCJDdXN0b20gQ1NTIEVkaXRvclwifSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJlZGl0b3Itd3JhcHBlclwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2lkOiBcImJkLWN1c3RvbWNzcy1lZGl0b3JcIiwgY2xhc3NOYW1lOiBcImVkaXRvclwiLCByZWY6IFwiZWRpdG9yXCJ9LCBzZWxmLmNzcylcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWF0dGFjaC1jb250cm9sc1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidWxcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJjaGVja2JveC1ncm91cFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KENoZWNrYm94LCB7aWQ6IFwibGl2ZS11cGRhdGVcIiwgdGV4dDogXCJMaXZlIFVwZGF0ZVwiLCBvbkNoYW5nZTogdGhpcy5vbkNoYW5nZSwgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl19KVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7aWQ6IFwiYmQtY3VzdG9tY3NzLWRldGFjaC1jb250cm9scy1idXR0b25cIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiM3B4IDAgMCAzcHhcIiwgYm9yZGVyUmlnaHQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJ1cGRhdGVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVwZGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMFwiLCBib3JkZXJMZWZ0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjMmQyZDJkXCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwic2F2ZVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiU2F2ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtib3JkZXJSYWRpdXM6IFwiMCAzcHggM3B4IDBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzNmNDE0NlwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcImRldGFjaFwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiRGV0YWNoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJzcGFuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3R5bGU6IHtmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiNXB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiVW5zYXZlZCBjaGFuZ2VzIGFyZSBsb3N0IG9uIGRldGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImhlbHAtdGV4dFwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUHJlc3MgXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJjb2RlXCIsIHtjbGFzc05hbWU6IFwiaW5saW5lXCJ9LCBcImN0cmxcIiksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIitcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInNwYW5cIiwge2NsYXNzTmFtZTogXCJpbmxpbmVcIn0sIFwiLFwiKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiIHdpdGggdGhlIGVkaXRvciBmb2N1c2VkIHRvIGFjY2VzcyB0aGUgZWRpdG9yJ3Mgc2V0dGluZ3MuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGFyZykge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHN3aXRjaCAoYXJnKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJkZXRhY2hcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuZGV0YWNoKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoaWQsIGNoZWNrZWQpIHtcclxuICAgICAgICBzd2l0Y2ggKGlkKSB7XHJcbiAgICAgICAgICAgIGNhc2UgXCJsaXZlLXVwZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0gPSBjaGVja2VkO1xyXG4gICAgICAgICAgICAgICAgU2V0dGluZ3Muc2F2ZVNldHRpbmdzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlQ3NzKCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVTdHlsZShcImN1c3RvbWNzc1wiKTtcclxuICAgICAgICBET00uYWRkU3R5bGUoXCJjdXN0b21jc3NcIiwgdGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpKTtcclxuICAgIH1cclxuXHJcbiAgICBzYXZlQ3NzKCkge1xyXG4gICAgICAgIERhdGFTdG9yZS5zZXRCRERhdGEoXCJiZGN1c3RvbWNzc1wiLCBCdWZmZXIuZnJvbSh0aGlzLmVkaXRvci5zZXNzaW9uLmdldFZhbHVlKCksIFwidXRmLThcIikudG9TdHJpbmcoXCJiYXNlNjRcIikpO1xyXG4gICAgfVxyXG5cclxuICAgIGRldGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IHRydWVcclxuICAgICAgICB9KTtcclxuICAgICAgICBjb25zdCBkcm9vdCA9IHNlbGYuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIGlmICghZHJvb3QpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGQUlMRUQgVE8gSU5KRUNUIFJPT1Q6IC5hcHBcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgQkRWMi5yZWFjdERvbS5yZW5kZXIoc2VsZi5kZXRhY2hlZEVkaXRvciwgZHJvb3QpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBkZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0RGV0YWNoZWRSb290KCkpIHJldHVybiBudWxsO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kZXRhY2hlZFJvb3Q7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBfcm9vdDtcclxuICAgIH1cclxuXHJcbiAgICBpbmplY3REZXRhY2hlZFJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgYXBwID0gRE9NLnF1ZXJ5KFwiLmFwcCwgLlwiK1V0aWxzLnJlbW92ZURhKEJETW9kdWxlcy5nZXQoZSA9PiBlLmFwcCAmJiBlLmxheWVycylbMF0uYXBwKSk7XHJcbiAgICAgICAgaWYgKCFhcHApIHJldHVybiBmYWxzZTtcclxuICAgICAgICBET00uaW5zZXJ0QWZ0ZXIoRE9NLmNyZWF0ZUVsZW1lbnQoYDxkaXYgaWQ9XCJiZC1jdXN0b21jc3MtZGV0YWNoLWNvbnRhaW5lclwiPmApLCBhcHApO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF0dGFjaCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGV0YWNoZWQ6IGZhbHNlXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQge3NldHRpbmdzQ29va2llfSBmcm9tIFwiLi4vMGdsb2JhbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzIGZyb20gXCIuLi9tb2R1bGVzL3NldHRpbmdzUGFuZWxcIjtcclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IERhdGFTdG9yZSBmcm9tIFwiLi4vbW9kdWxlcy9kYXRhU3RvcmVcIjtcclxuaW1wb3J0IERPTSBmcm9tIFwiLi4vbW9kdWxlcy9kb210b29sc1wiO1xyXG5pbXBvcnQgVXRpbHMgZnJvbSBcIi4uL21vZHVsZXMvdXRpbHNcIlxyXG5cclxuaW1wb3J0IENoZWNrYm94IGZyb20gXCIuL2NoZWNrYm94XCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfQ3NzRWRpdG9yRGV0YWNoZWQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBzZWxmLm9uQ2xpY2sgPSBzZWxmLm9uQ2xpY2suYmluZChzZWxmKTtcclxuICAgICAgICBzZWxmLnVwZGF0ZUNzcyA9IHNlbGYudXBkYXRlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5zYXZlQ3NzID0gc2VsZi5zYXZlQ3NzLmJpbmQoc2VsZik7XHJcbiAgICAgICAgc2VsZi5vbkNoYW5nZSA9IHNlbGYub25DaGFuZ2UuYmluZChzZWxmKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICBET00uYWRkQ2xhc3MoRE9NLnF1ZXJ5KFwiI2FwcC1tb3VudFwiKSwgXCJiZC1kZXRhY2hlZC1lZGl0b3JcIik7XHJcbiAgICAgICAgQkRWMi5lZGl0b3JEZXRhY2hlZCA9IHRydWU7XHJcbiAgICAgICAgLy8gdGhpcy51cGRhdGVMaW5lQ291bnQoKTtcclxuICAgICAgICB0aGlzLmVkaXRvciA9IGFjZS5lZGl0KFwiYmQtY3VzdG9tY3NzLWVkaXRvci1kZXRhY2hlZFwiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRUaGVtZShcImFjZS90aGVtZS9kaXNjb3JkXCIpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNlc3Npb24uc2V0TW9kZShcImFjZS9tb2RlL2Nzc1wiKTtcclxuICAgICAgICB0aGlzLmVkaXRvci5zZXRTaG93UHJpbnRNYXJnaW4oZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZWRpdG9yLnNldEZvbnRTaXplKDE0KTtcclxuICAgICAgICB0aGlzLmVkaXRvci5vbihcImNoYW5nZVwiLCAoKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghc2V0dGluZ3NDb29raWVbXCJiZGEtY3NzLTBcIl0pIHJldHVybjtcclxuICAgICAgICAgICAgdGhpcy5zYXZlQ3NzKCk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIERPTS5yZW1vdmVDbGFzcyhET00ucXVlcnkoXCIjYXBwLW1vdW50XCIpLCBcImJkLWRldGFjaGVkLWVkaXRvclwiKTtcclxuICAgICAgICBCRFYyLmVkaXRvckRldGFjaGVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5lZGl0b3IuZGVzdHJveSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUxpbmVDb3VudCgpIHtcclxuICAgICAgICBjb25zdCBsaW5lQ291bnQgPSB0aGlzLnJlZnMuZWRpdG9yLnZhbHVlLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcclxuICAgICAgICBpZiAobGluZUNvdW50ID09IHRoaXMucHJvcHMubGluZXMpIHJldHVybjtcclxuICAgICAgICB0aGlzLnJlZnMubGluZXMudGV4dENvbnRlbnQgPSBBcnJheS5mcm9tKG5ldyBBcnJheShsaW5lQ291bnQpLCAoXywgaSkgPT4gaSArIDEpLmpvaW4oXCIuXFxuXCIpICsgXCIuXCI7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5saW5lcyA9IGxpbmVDb3VudDtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSxcclxuICAgICAgICAgICAgbW9kZTogXCJjc3NcIixcclxuICAgICAgICAgICAgaW5kZW50VW5pdDogNCxcclxuICAgICAgICAgICAgdGhlbWU6IFwibWF0ZXJpYWxcIixcclxuICAgICAgICAgICAgc2Nyb2xsYmFyU3R5bGU6IFwic2ltcGxlXCJcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjc3MoKSB7XHJcbiAgICAgICAgY29uc3QgX2Njc3MgPSBEYXRhU3RvcmUuZ2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIik7XHJcbiAgICAgICAgbGV0IGNjc3MgPSBcIlwiO1xyXG4gICAgICAgIGlmIChfY2NzcyAmJiBfY2NzcyAhPT0gXCJcIikge1xyXG4gICAgICAgICAgICBjY3NzID0gQnVmZmVyLmZyb20oX2Njc3MsIFwiYmFzZTY0XCIpLnRvU3RyaW5nKFwidXRmOFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNjc3M7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvb3QoKSB7XHJcbiAgICAgICAgY29uc3QgX3Jvb3QgPSBET00ucXVlcnkoXCIjYmQtY3VzdG9tY3NzLWRldGFjaC1jb250YWluZXJcIik7XHJcbiAgICAgICAgaWYgKCFfcm9vdCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5qZWN0Um9vdCgpKSByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGV0YWNoZWRSb290O1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gX3Jvb3Q7XHJcbiAgICB9XHJcblxyXG4gICAgaW5qZWN0Um9vdCgpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBET00ucXVlcnkoXCIuYXBwLCAuXCIrVXRpbHMucmVtb3ZlRGEoQkRNb2R1bGVzLmdldChlID0+IGUuYXBwICYmIGUubGF5ZXJzKVswXS5hcHApKTtcclxuICAgICAgICBpZiAoIWFwcCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIERPTS5pbnNlcnRBZnRlcihET00uY3JlYXRlRWxlbWVudChgPGRpdiBpZD1cImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udGFpbmVyXCI+YCksIGFwcCk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmQtZGV0YWNoZWQtY3NzLWVkaXRvclwiLCBpZDogXCJiZC1jdXN0b21jc3MtZGV0YWNoLWVkaXRvclwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtpZDogXCJiZC1jdXN0b21jc3MtaW5uZXJwYW5lXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiZWRpdG9yLXdyYXBwZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtpZDogXCJiZC1jdXN0b21jc3MtZWRpdG9yLWRldGFjaGVkXCIsIGNsYXNzTmFtZTogXCJlZGl0b3JcIiwgcmVmOiBcImVkaXRvclwifSwgc2VsZi5jc3MpXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1hdHRhY2gtY29udHJvbHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcInVsXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiY2hlY2tib3gtZ3JvdXBcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChDaGVja2JveCwge2lkOiBcImxpdmUtdXBkYXRlXCIsIHRleHQ6IFwiTGl2ZSBVcGRhdGVcIiwgb25DaGFuZ2U6IHNlbGYub25DaGFuZ2UsIGNoZWNrZWQ6IHNldHRpbmdzQ29va2llW1wiYmRhLWNzcy0wXCJdfSlcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2lkOiBcImJkLWN1c3RvbWNzcy1kZXRhY2gtY29udHJvbHMtYnV0dG9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjNweCAwIDAgM3B4XCIsIGJvcmRlclJpZ2h0OiBcIjFweCBzb2xpZCAjM2Y0MTQ2XCJ9LCBjbGFzc05hbWU6IFwiYnRuIGJ0bi1wcmltYXJ5XCIsIG9uQ2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkNsaWNrKFwidXBkYXRlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJVcGRhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjBcIiwgYm9yZGVyTGVmdDogXCIxcHggc29saWQgIzJkMmQyZFwiLCBib3JkZXJSaWdodDogXCIxcHggc29saWQgIzJkMmQyZFwifSwgY2xhc3NOYW1lOiBcImJ0biBidG4tcHJpbWFyeVwiLCBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub25DbGljayhcInNhdmVcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlNhdmVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJ1dHRvblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Ym9yZGVyUmFkaXVzOiBcIjAgM3B4IDNweCAwXCIsIGJvcmRlckxlZnQ6IFwiMXB4IHNvbGlkICMzZjQxNDZcIn0sIGNsYXNzTmFtZTogXCJidG4gYnRuLXByaW1hcnlcIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpY2soXCJhdHRhY2hcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkF0dGFjaFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7Zm9udFNpemU6IFwiMTBweFwiLCBtYXJnaW5MZWZ0OiBcIjVweFwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlVuc2F2ZWQgY2hhbmdlcyBhcmUgbG9zdCBvbiBhdHRhY2hcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShpZCwgY2hlY2tlZCkge1xyXG4gICAgICAgIHN3aXRjaCAoaWQpIHtcclxuICAgICAgICAgICAgY2FzZSBcImxpdmUtdXBkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICBzZXR0aW5nc0Nvb2tpZVtcImJkYS1jc3MtMFwiXSA9IGNoZWNrZWQ7XHJcbiAgICAgICAgICAgICAgICBTZXR0aW5ncy5zYXZlU2V0dGluZ3MoKTtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBvbkNsaWNrKGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgc3dpdGNoIChpZCkge1xyXG4gICAgICAgICAgICBjYXNlIFwiYXR0YWNoXCI6XHJcbiAgICAgICAgICAgICAgICBpZiAoRE9NLnF1ZXJ5KFwiI2VkaXRvci1kZXRhY2hlZFwiKSkgc2VsZi5wcm9wcy5hdHRhY2goKTtcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3REb20udW5tb3VudENvbXBvbmVudEF0Tm9kZShzZWxmLnJvb3QpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yb290LnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIGNhc2UgXCJ1cGRhdGVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlQ3NzKCk7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgY2FzZSBcInNhdmVcIjpcclxuICAgICAgICAgICAgICAgIHNlbGYuc2F2ZUNzcygpO1xyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZUNzcygpIHtcclxuICAgICAgICBET00ucmVtb3ZlU3R5bGUoXCJjdXN0b21jc3NcIik7XHJcbiAgICAgICAgRE9NLmFkZFN0eWxlKFwiY3VzdG9tY3NzXCIsIHRoaXMuZWRpdG9yLnNlc3Npb24uZ2V0VmFsdWUoKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2F2ZUNzcygpIHtcclxuICAgICAgICBEYXRhU3RvcmUuc2V0QkREYXRhKFwiYmRjdXN0b21jc3NcIiwgQnVmZmVyLmZyb20odGhpcy5lZGl0b3Iuc2Vzc2lvbi5nZXRWYWx1ZSgpLCBcInV0Zi04XCIpLnRvU3RyaW5nKFwiYmFzZTY0XCIpKTtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCREVycm9yQm91bmRhcnkgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgdGhpcy5zdGF0ZSA9IHtoYXNFcnJvcjogZmFsc2V9O1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudERpZENhdGNoKCkge1xyXG4gICAgICB0aGlzLnNldFN0YXRlKHtoYXNFcnJvcjogdHJ1ZX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgaWYgKHRoaXMuc3RhdGUuaGFzRXJyb3IpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJyZWFjdC1lcnJvclwifSwgXCJDb21wb25lbnQgRXJyb3JcIik7ICBcclxuICAgICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47IFxyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IEJERXJyb3JCb3VuZGFyeS5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQkRFcnJvckJvdW5kYXJ5LnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi8uLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5jb25zdCBSZWFjdCA9IEJEVjIuUmVhY3Q7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZWxldGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSBmaWxsPVwidmFyKC0tdGV4dC1ub3JtYWwpXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIm5vbmVcIiBkPVwiTTAgMGgyNHYyNEgwVjB6XCIvPjxwYXRoIGQ9XCJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0elwiLz5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIERvd25BcnJvdyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjE2cHhcIjtcclxuICAgICAgICByZXR1cm4gPHN2ZyBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgc3R5bGU9e3t3aWR0aDogc2l6ZSwgaGVpZ2h0OiBzaXplfX0+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk04LjEyIDkuMjlMMTIgMTMuMTdsMy44OC0zLjg4Yy4zOS0uMzkgMS4wMi0uMzkgMS40MSAwIC4zOS4zOS4zOSAxLjAyIDAgMS40MWwtNC41OSA0LjU5Yy0uMzkuMzktMS4wMi4zOS0xLjQxIDBMNi43IDEwLjdjLS4zOS0uMzktLjM5LTEuMDIgMC0xLjQxLjM5LS4zOCAxLjAzLS4zOSAxLjQyIDB6XCIvPlxyXG4gICAgICAgICAgICAgICAgPC9zdmc+O1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIyNHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZSB8fCBcIlwifSB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgICAgICA8cGF0aCBkPVwiTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3pcIiAvPlxyXG4gICAgICAgICAgICAgICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiIC8+XHJcbiAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsInsvKiA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCIgd2lkdGg9XCIxOHB4XCIgaGVpZ2h0PVwiMThweFwiPlxyXG4gICAgPHBhdGggZD1cIk0wIDBoMjR2MjRIMHpcIiBmaWxsPVwibm9uZVwiLz5cclxuICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuPC9zdmc+ICovfVxyXG5cclxuaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmNvbnN0IFJlYWN0ID0gQkRWMi5SZWFjdDtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnByb3BzLnNpemUgfHwgXCIxOHB4XCI7XHJcbiAgICAgICAgcmV0dXJuIDxzdmcgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ2YXIoLS10ZXh0LW5vcm1hbClcIiBjbGFzc05hbWU9e3RoaXMucHJvcHMuY2xhc3NOYW1lIHx8IFwiXCJ9IHN0eWxlPXt7d2lkdGg6IHNpemUsIGhlaWdodDogc2l6ZX19IG9uQ2xpY2s9e3RoaXMucHJvcHMub25DbGlja30+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMCAwaDI0djI0SDB6XCIgZmlsbD1cIm5vbmVcIi8+XHJcbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyelwiLz5cclxuICAgICAgICA8L3N2Zz47XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplIHx8IFwiMTZweFwiO1xyXG4gICAgICAgIHJldHVybiA8c3ZnIGNsYXNzTmFtZT17dGhpcy5wcm9wcy5jbGFzc05hbWUgfHwgXCJcIn0gZmlsbD1cInZhcigtLXRleHQtbm9ybWFsKVwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBzdHlsZT17e3dpZHRoOiBzaXplLCBoZWlnaHQ6IHNpemV9fT5cclxuICAgICAgICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwibm9uZVwiIGQ9XCJNMCAwaDI0djI0SDBWMHpcIi8+XHJcbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0elwiLz5cclxuICAgICAgICAgICAgICAgIDwvc3ZnPjtcclxuICAgIH1cclxufSIsImxldCBtYXJnaW5Nb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Ub3A2MClbMF1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hcmdpblRvcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighbWFyZ2luTW9kdWxlKW1hcmdpbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpblRvcDYwKVswXVxyXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpblRvcDYwfT48L2Rpdj5cclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NUaXRsZSBmcm9tIFwiLi9zZXR0aW5nc1RpdGxlXCI7XHJcbmltcG9ydCBWMkNfU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBkYXRhU3RvcmUgZnJvbSBcIi4uL21vZHVsZXMvZGF0YVN0b3JlXCI7XHJcbmltcG9ydCB7IGRlZmF1bHRSUEMsIHNldHRpbmdzUlBDIH0gZnJvbSBcIi4uLzBnbG9iYWxzXCI7XHJcbmltcG9ydCBDdXN0b21SaWNoUHJlc2VuY2UgZnJvbSBcIi4uL21vZHVsZXMvQ3VzdG9tUmljaFByZXNlbmNlXCJcclxuaW1wb3J0IHsgcmVtb3RlIH0gZnJvbSBcImVsZWN0cm9uXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5cclxuY29uc3QgUmVhY3QgPSBCRFYyLlJlYWN0O1xyXG5cclxubGV0IFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlc1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfUHJlc2VuY2VTZXR0aW5ncyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgZGF0YTogZGF0YVN0b3JlLmdldFNldHRpbmdHcm91cChcInJwY1wiKSB8fCBkZWZhdWx0UlBDLFxyXG4gICAgICAgICAgICBhc3NldHM6IFtdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnByZXZpZXcgPSBudWxsXHJcbiAgICAgICAgdGhpcy5pc2ZldGNoaW5nID0gZmFsc2VcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmRhdGEuYXBwbGljYXRpb25faWQpe1xyXG4gICAgICAgICAgICB0aGlzLmZldGNoQXNzZXRzKClcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuYXNzZXRDb21wb25lbnRzID0gbmV3IFNldCgpXHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlV2hlbkZldGNoZWQoY29tcCl7XHJcbiAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuYWRkKGNvbXApXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7SW5wdXRUZXh0fSBzZXR0aW5nIFxyXG4gICAgICovXHJcbiAgICBvbkNoYW5nZShzZXR0aW5nLCB2YWx1ZSl7XHJcbiAgICAgICAgbGV0IGRlZmF1bHRTZXR0aW5nID0gUlBDUHJvcHMuZmluZChlID0+IGUuaWQgPT09IHNldHRpbmcucHJvcHMuaWQpXHJcblxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBkYXRhOiBPYmplY3QuYXNzaWduKHNldHRpbmdzUlBDLCB0aGlzLnN0YXRlLmRhdGEsIHtcclxuICAgICAgICAgICAgICAgIFtkZWZhdWx0U2V0dGluZy5pZF06ICEhdmFsdWUgPyB2YWx1ZSA6IG51bGxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgIGFzc2V0czogdGhpcy5zdGF0ZS5hc3NldHNcclxuICAgICAgICB9KVxyXG4gICAgICAgIGlmKHNldHRpbmcucHJvcHMuaWQgPT09IFwiYXBwbGljYXRpb25faWRcIil7XHJcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVN0b3JlLnNldFNldHRpbmdHcm91cChcInJwY1wiLCBzZXR0aW5nc1JQQyk7XHJcbiAgICAgICAgdGhpcy5wcmV2aWV3LmZvcmNlVXBkYXRlKClcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2Uuc2V0KHNldHRpbmdzUlBDKVxyXG4gICAgfVxyXG5cclxuICAgIGZldGNoQXNzZXRzKCl7XHJcbiAgICAgICAgaWYodGhpcy5pc2ZldGNoaW5nID09PSB0cnVlKXtcclxuICAgICAgICAgICAgbGV0IGFwcCA9IHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZFxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmKHRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCAhPT0gYXBwKXtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hBc3NldHMoKVxyXG4gICAgICAgICAgICB9LCA1MDAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIXRoaXMuc3RhdGUuZGF0YS5hcHBsaWNhdGlvbl9pZCl7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IHRydWVcclxuICAgICAgICBDdXN0b21SaWNoUHJlc2VuY2UuZmV0Y2hBc3NldHModGhpcy5zdGF0ZS5kYXRhLmFwcGxpY2F0aW9uX2lkKVxyXG4gICAgICAgIC50aGVuKGFzc2V0cyA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBPYmplY3Qua2V5cyhhc3NldHMpLm1hcChrID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYXNzZXQgPSBhc3NldHNba11cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogYXNzZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGFzc2V0Lm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGFzc2V0LnR5cGVcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNmZXRjaGluZyA9IGZhbHNlXHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdGhpcy5zdGF0ZS5kYXRhLFxyXG4gICAgICAgICAgICAgICAgYXNzZXRzOiBbXVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKClcclxuICAgICAgICAgICAgdGhpcy5hc3NldENvbXBvbmVudHMuZm9yRWFjaChlID0+IGUuZm9yY2VVcGRhdGUoKSlcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVByZXZpZXcoZGF0YSl7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGRhdGFcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIFYyQ19QcmVzZW5jZVNldHRpbmdzTW9kdWxlcyB8fCAoVjJDX1ByZXNlbmNlU2V0dGluZ3NNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5tYXJnaW5Cb3R0b20yMClbMF1cclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgPFYyQ19TZXR0aW5nc0dyb3VwIHRpdGxlPVwiUmljaFByZXNlbmNlIFNldHRpbmdzXCIgc2V0dGluZ3M9e3RoaXMucHJvcHMuc2V0dGluZ3N9IG9uQ2hhbmdlPXt0aGlzLnByb3BzLm9uQ2hhbmdlfS8+LFxyXG4gICAgICAgICAgICA8TWFyZ2luVG9wIC8+LFxyXG4gICAgICAgICAgICA8VjJDX1NldHRpbmdzVGl0bGUgdGV4dD1cIlJpY2hQcmVzZW5jZVwiLz4sXHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICB7LyoqIG9wdGlvbnMgKi99XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5vcHRpb25zQ29tcG9uZW50c31cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgPE1hcmdpblRvcCAvPlxyXG4gICAgICAgICAgICAgICAgPFYyQ19TZXR0aW5nc1RpdGxlIHRleHQ9XCJQcmV2aWV3XCIvPlxyXG4gICAgICAgICAgICAgICAgey8qKiBwcmV2aWV3ICovfVxyXG4gICAgICAgICAgICAgICAgPFJwY1ByZXZpZXcgc2V0dGluZ3M9e3RoaXN9Lz5cclxuICAgICAgICAgICAgPC9kaXY+LFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17bWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT48L2Rpdj4sXHJcbiAgICAgICAgICAgIDxidXR0b24gc3R5bGU9e3tvcGFjaXR5OiAwLjAxfX0gb25DbGljaz17d2luZG93Lm9oZ29kb2hmdWNrfT5cclxuICAgICAgICAgICAgICAgIE9oIGdvZCBPaCBmdWNrXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPixcclxuICAgICAgICAgICAgPGJ1dHRvbiBzdHlsZT17e29wYWNpdHk6IDAuMDF9fSBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZW1vdGUuc2hlbGwub3BlbkV4dGVybmFsKFwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1Ma1lhN3Jwc19nNFwiKVxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIFNlZSA/IEkgcHVsbGVkIGEgbGl0bGUgc25lYWt5IG9uIHlhXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgb3B0aW9uc0NvbXBvbmVudHMoKXtcclxuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9uc0NvbXBvbmVudHMgfHwgKHRoaXMuX29wdGlvbnNDb21wb25lbnRzID0gUlBDUHJvcHMubWFwKGUgPT4ge1xyXG4gICAgICAgICAgICBpZihlLnR5cGUgPT09IFwidGV4dFwiKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiA8SW5wdXRUZXh0IHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKGUudHlwZSA9PT0gXCJudW1iZXJcIil7XHJcbiAgICAgICAgICAgICAgICBsZXQgYXJyYXkgPSBbPElucHV0TnVtYmVyIHNldHRpbmc9e2V9IG1hbmFnZXI9e3RoaXN9IGlkPXtlLmlkfS8+XS8qXHJcbiAgICAgICAgICAgICAgICBpZihlLmlkID09PSBcInRpbWVzdGFtcHMuc3RhcnRcIil7XHJcbiAgICAgICAgICAgICAgICAgICAgYXJyYXkudW5zaGlmdCg8RGlzY29yZEJ1dHRvbiB0aXRsZT1cIkNvcHkgQ3VycmVudCBUaW1lc3RhbXBcIiBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgICAgIH19IC8+KVxyXG4gICAgICAgICAgICAgICAgfSovXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlcclxuICAgICAgICAgICAgfWVsc2UgaWYoZS50eXBlID09PSBcImNob2ljZVwiKXtcclxuICAgICAgICAgICAgICAgIGlmKFtcImFzc2V0cy5zbWFsbFwiLCBcImFzc2V0cy5sYXJnZVwiXS5pbmNsdWRlcyhlLmlkKSl7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDxJbnB1dENob2ljZSBzZXR0aW5nPXtlfSBtYW5hZ2VyPXt0aGlzfSBpZD17ZS5pZH0gY2hvaWNlcz17W3t2YWx1ZTogXCJub25lXCIsIGxhYmVsOiBcIk5vIGFzc2V0c1wifV0uY29uY2F0KHRoaXMuc3RhdGUuYXNzZXRzLm1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBcImFzc2V0LVwiK2UuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZS5uYW1lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KSl9Lz5cclxuICAgICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlVua25vd24gY2hvaWNlLlwiXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KSlcclxuICAgIH1cclxufVxyXG5jb25zdCBSUENQcm9wcyA9IFtcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJBcHBsaWNhdGlvbiBJRFwiLFxyXG4gICAgICAgIGlkOiBcImFwcGxpY2F0aW9uX2lkXCIsXHJcbiAgICAgICAgdHlwZTogXCJudW1iZXJcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCI3MTE0MTY5NTc3MTg3NTc0MThcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJOYW1lXCIsXHJcbiAgICAgICAgaWQ6IFwibmFtZVwiLFxyXG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxyXG4gICAgICAgIHBsYWNlaG9sZGVyOiBcIkxpZ2h0Y29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIkRldGFpbHNcIixcclxuICAgICAgICBpZDogXCJkZXRhaWxzXCIsXHJcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXHJcbiAgICAgICAgcGxhY2Vob2xkZXI6IFwiQnJvd3NpbmcgRGlzY29yZFwiXHJcbiAgICB9LFxyXG4gICAge1xyXG4gICAgICAgIHRpdGxlOiBcIlN0YXRlXCIsXHJcbiAgICAgICAgaWQ6IFwic3RhdGVcIixcclxuICAgICAgICB0eXBlOiBcInRleHRcIixcclxuICAgICAgICBwbGFjZWhvbGRlcjogXCJMaWdodGNvcmQgQ2xpZW50XCJcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgICAgdGl0bGU6IFwiVGltZXN0YW1wIFN0YXJ0XCIsXHJcbiAgICAgICAgaWQ6IFwidGltZXN0YW1wcy5zdGFydFwiLFxyXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXHJcbiAgICAgICAgZ2V0IHBsYWNlaG9sZGVyKCl7XHJcbiAgICAgICAgICAgIHJldHVybiBEYXRlLm5vdygpXHJcbiAgICAgICAgfVxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJMYXJnZUFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLmxhcmdlXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuICAgIHtcclxuICAgICAgICB0aXRsZTogXCJTbWFsbEFzc2V0XCIsXHJcbiAgICAgICAgaWQ6IFwiYXNzZXRzLnNtYWxsXCIsXHJcbiAgICAgICAgdHlwZTogXCJjaG9pY2VcIlxyXG4gICAgfSxcclxuXVxyXG5cclxubGV0IGlucHV0VGV4dE1vZHVsZXNcclxuY2xhc3MgSW5wdXRUZXh0IGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIGlmKGlucHV0VGV4dE1vZHVsZXMgJiYgaW5wdXRUZXh0TW9kdWxlc1swXSlyZXR1cm4gaW5wdXRUZXh0TW9kdWxlc1xyXG4gICAgICAgIHJldHVybiBpbnB1dFRleHRNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5pbnB1dCA9IDx3aW5kb3cuTGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5UZXh0SW5wdXQgcGxhY2Vob2xkZXI9e3NldHRpbmcucGxhY2Vob2xkZXJ9IG5hbWU9e3NldHRpbmcuaWR9IHZhbHVlPXt0aGlzLnN0YXRlLmRhdGF9IG9uQ2hhbmdlPXsodmFsdWUpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBkYXRhOiB2YWx1ZVxyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBpZighdGhpcy5sYXN0RWRpdGVkIHx8IHRoaXMubGFzdEVkaXRlZCA8IERhdGUubm93KCkgLSA1MDApe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHZhbHVlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9ZWxzZSBpZighdGhpcy5pc1RpbWluZyl7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgICAgIH0sIDUwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgICAgIGlucHV0TW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlMixcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICB7dGhpcy5pbnB1dH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxEaXZpZGVyLz5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBJbnB1dE51bWJlck1vZHVsZXNcclxuY2xhc3MgSW5wdXROdW1iZXIgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIElucHV0TnVtYmVyTW9kdWxlcyB8fCAoSW5wdXROdW1iZXJNb2R1bGVzID0gW1xyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5yZW1vdmVLZXliaW5kKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0TWFyZ2luaDUpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclN0YW5kYXJkKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuc2l6ZTMyKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuX2hvcml6b250YWwpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5pbnB1dE1pbmkpWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zaXplMTYgJiYgZS5zaXplMjApWzBdLFxyXG4gICAgICAgICAgICBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb2xvclRyYW5zcGFyZW50KVswXSxcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKXtcclxuICAgICAgICBzdXBlcihwcm9wcylcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGRhdGE6IHRoaXMucHJvcHMubWFuYWdlci5zdGF0ZS5kYXRhW3NldHRpbmcuaWRdXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmlucHV0ID0gPHdpbmRvdy5MaWdodGNvcmQuQXBpLkNvbXBvbmVudHMuaW5wdXRzLlRleHRJbnB1dCBwbGFjZWhvbGRlcj17c2V0dGluZy5wbGFjZWhvbGRlcn0gbmFtZT17c2V0dGluZy5pZH0gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gdHlwZT1cIm51bWJlclwiIG9uQ2hhbmdlPXsodmFsdWUsIG5hbWUsIGlucHV0KSA9PiB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvW15cXGRdKy9nLCBcIlwiKVxyXG4gICAgICAgICAgICBpZih2YWx1ZSA9PSB0aGlzLnN0YXRlLmRhdGEpe1xyXG4gICAgICAgICAgICAgICAgaW5wdXQuc2V0VmFsdWUodmFsdWUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYoIXRoaXMubGFzdEVkaXRlZCB8fCB0aGlzLmxhc3RFZGl0ZWQgPCBEYXRlLm5vdygpIC0gNTAwKXtcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSlcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdEVkaXRlZCA9IERhdGUubm93KClcclxuICAgICAgICAgICAgfWVsc2UgaWYoIXRoaXMuaXNUaW1pbmcpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB0aGlzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IG51bGxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RFZGl0ZWQgPSBEYXRlLm5vdygpXHJcbiAgICAgICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9fSB0eXBlPVwidGV4dFwiLz5cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgc2V0dGluZyA9IHRoaXMucHJvcHMuc2V0dGluZ1xyXG5cclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICByb3dNb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZSxcclxuICAgICAgICAgICAgbWFyZ2luTW9kdWxlMixcclxuICAgICAgICAgICAgY29sb3JNb2R1bGUsXHJcbiAgICAgICAgICAgIHNpemVNb2R1bGUsXHJcbiAgICAgICAgICAgIGZsZXhNb2R1bGUsXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8aDUgY2xhc3NOYW1lPXtjb2xvck1vZHVsZS5jb2xvclN0YW5kYXJkK1wiIFwiK3NpemVNb2R1bGUuc2l6ZTE0K1wiIFwiK21hcmdpbk1vZHVsZTIuaDUrXCIgXCIrbWFyZ2luTW9kdWxlMi5kZWZhdWx0TWFyZ2luaDV9PlxyXG4gICAgICAgICAgICAgICAgICAgIHtzZXR0aW5nLnRpdGxlfVxyXG4gICAgICAgICAgICAgICAgPC9oNT5cclxuICAgICAgICAgICAgICAgIHt0aGlzLmlucHV0fVxyXG4gICAgICAgICAgICAgICAge3NldHRpbmcuaWQgPT09IFwidGltZXN0YW1wcy5zdGFydFwiID8gXHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17KCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIERpc2NvcmROYXRpdmUuY2xpcGJvYXJkLmNvcHkoRGF0ZS5ub3coKStcIlwiKVxyXG4gICAgICAgICAgICAgICAgfX0gY29sb3I9XCJicmFuZFwiPkNvcHkgY3VycmVudCB0aW1lc3RhbXA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPiA6IG51bGx9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8RGl2aWRlci8+XHJcbiAgICAgICAgPC9kaXY+KVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgSW5wdXRDaG9pY2VNb2R1bGVzXHJcbmNsYXNzIElucHV0Q2hvaWNlIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBkYXRhOiB0aGlzLnByb3BzLm1hbmFnZXIuc3RhdGUuZGF0YVtzZXR0aW5nLmlkXSA/IFwiYXNzZXQtXCIrdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmRhdGFbc2V0dGluZy5pZF0gOiBcIm5vbmVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByb3BzLm1hbmFnZXIudXBkYXRlV2hlbkZldGNoZWQodGhpcylcclxuICAgIH1cclxuXHJcbiAgICBvbkNoYW5nZShkYXRhKXtcclxuICAgICAgICBsZXQgdmFsdWUgPSBkYXRhLnZhbHVlXHJcblxyXG4gICAgICAgIGlmKCF0aGlzLmxhc3RFZGl0ZWQgfHwgdGhpcy5sYXN0RWRpdGVkIDwgRGF0ZS5ub3coKSAtIDUwMCl7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMubWFuYWdlci5vbkNoYW5nZSh0aGlzLCB2YWx1ZSA9PT0gXCJub25lXCIgPyBudWxsIDogdmFsdWUucmVwbGFjZShcImFzc2V0LVwiLCBcIlwiKSlcclxuICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgIH1lbHNlIGlmKCF0aGlzLmlzVGltaW5nKXtcclxuICAgICAgICAgICAgdGhpcy5pc1RpbWluZyA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5tYW5hZ2VyLm9uQ2hhbmdlKHRoaXMsIHRoaXMuc3RhdGUuZGF0YSA9PT0gXCJub25lXCIgPyBudWxsIDogdGhpcy5zdGF0ZS5kYXRhLnJlcGxhY2UoXCJhc3NldC1cIiwgXCJcIikpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGltaW5nID0gbnVsbFxyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0RWRpdGVkID0gRGF0ZS5ub3coKVxyXG4gICAgICAgICAgICB9LCA1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgZGF0YTogdmFsdWVcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXQgbW9kdWxlcygpe1xyXG4gICAgICAgIHJldHVybiBJbnB1dENob2ljZU1vZHVsZXMgfHwgKElucHV0Q2hvaWNlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLm1hcmdpbkJvdHRvbTIwKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdE1hcmdpbmg1KVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuY29sb3JTdGFuZGFyZClbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpemUzMilbMF0sXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLl9ob3Jpem9udGFsKVswXVxyXG4gICAgICAgIF0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgbGV0IHNldHRpbmcgPSB0aGlzLnByb3BzLnNldHRpbmdcclxuXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgcm93TW9kdWxlLFxyXG4gICAgICAgICAgICBtYXJnaW5Nb2R1bGUsXHJcbiAgICAgICAgICAgIG1hcmdpbk1vZHVsZTIsXHJcbiAgICAgICAgICAgIGNvbG9yTW9kdWxlLFxyXG4gICAgICAgICAgICBzaXplTW9kdWxlLFxyXG4gICAgICAgICAgICBmbGV4TW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5wcm9wcy5tYW5hZ2VyLnN0YXRlLmFzc2V0cy5tYXAoZSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICB2YWx1ZTogXCJhc3NldC1cIitlLmlkLFxyXG4gICAgICAgICAgICAgICAgbGFiZWw6IGUubmFtZVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgb3B0aW9ucy51bnNoaWZ0KHtcclxuICAgICAgICAgICAgdmFsdWU6IFwibm9uZVwiLFxyXG4gICAgICAgICAgICBsYWJlbDogXCJObyBhc3NldHNcIlxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHJldHVybiAoPGRpdiBjbGFzc05hbWU9e3Jvd01vZHVsZS5yb3crXCIgXCIrbWFyZ2luTW9kdWxlLm1hcmdpbkJvdHRvbTIwfT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2Ake3Jvd01vZHVsZS5pdGVtfSAke2ZsZXhNb2R1bGUuZmxleENoaWxkfWB9PlxyXG4gICAgICAgICAgICAgICAgPGg1IGNsYXNzTmFtZT17Y29sb3JNb2R1bGUuY29sb3JTdGFuZGFyZCtcIiBcIitzaXplTW9kdWxlLnNpemUxNCtcIiBcIittYXJnaW5Nb2R1bGUyLmg1K1wiIFwiK21hcmdpbk1vZHVsZTIuZGVmYXVsdE1hcmdpbmg1fT5cclxuICAgICAgICAgICAgICAgICAgICB7c2V0dGluZy50aXRsZX1cclxuICAgICAgICAgICAgICAgIDwvaDU+XHJcbiAgICAgICAgICAgICAgICA8d2luZG93LkxpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuRHJvcGRvd24gdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb3B0aW9ucz17b3B0aW9uc30gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gLz5cclxuICAgICAgICAgICAgICAgIHsvKjxTZWxlY3QgdmFsdWU9e3RoaXMuc3RhdGUuZGF0YX0gb25DaGFuZ2U9e3RoaXMub25DaGFuZ2UuYmluZCh0aGlzKX0gb3B0aW9ucz17b3B0aW9uc30vPiovfVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPERpdmlkZXIvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IERpdmlkZXJNb2R1bGVzID0gW11cclxuY2xhc3MgRGl2aWRlciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQge1xyXG4gICAgZ2V0IG1vZHVsZXMoKXtcclxuICAgICAgICByZXR1cm4gRGl2aWRlck1vZHVsZXMmJkRpdmlkZXJNb2R1bGVzWzBdID8gRGl2aWRlck1vZHVsZXMgOiAoRGl2aWRlck1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJETW9kdWxlcy5nZXQoZSA9PiBlLmRpdmlkZXIgJiYgT2JqZWN0LmtleXMoZSkubGVuZ3RoID09PSAxKVswXSxcclxuICAgICAgICAgICAgQkRNb2R1bGVzLmdldChlID0+IGUuZGl2aWRlckRlZmF1bHQpWzBdXHJcbiAgICAgICAgXSlcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgW1xyXG4gICAgICAgICAgICBkaXZpZGVyLFxyXG4gICAgICAgICAgICBkaXZpZGVyRGVmYXVsdFxyXG4gICAgICAgIF0gPSB0aGlzLm1vZHVsZXNcclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3M9e2Ake2RpdmlkZXIuZGl2aWRlcn0gJHtkaXZpZGVyRGVmYXVsdC5kaXZpZGVyRGVmYXVsdH1gfT48L2Rpdj5cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRGlzY29yZEJ1dHRvbiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBsZXQgcm93TW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUucmVtb3ZlS2V5YmluZClbMF1cclxuICAgICAgICBsZXQgbWFyZ2luTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tMjApWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5faG9yaXpvbnRhbClbMF1cclxuXHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17cm93TW9kdWxlLnJvdytcIiBcIittYXJnaW5Nb2R1bGUubWFyZ2luQm90dG9tMjB9PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YCR7cm93TW9kdWxlLml0ZW19ICR7ZmxleE1vZHVsZS5mbGV4Q2hpbGR9YH0+XHJcbiAgICAgICAgICAgICAgICA8TGlnaHRjb3JkLkFwaS5Db21wb25lbnRzLmlucHV0cy5CdXR0b24gb25DbGljaz17dGhpcy5wcm9wcy5vbkNsaWNrfSBjb2xvcj1cImJyYW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3RoaXMucHJvcHMudGl0bGV9XHJcbiAgICAgICAgICAgICAgICA8L0xpZ2h0Y29yZC5BcGkuQ29tcG9uZW50cy5pbnB1dHMuQnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj4pXHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFJwY1ByZXZpZXcgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMgPSB7fSl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgYWN0aXZlOiBcInByb2ZpbGVcIlxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRhYnMgPSBbXVxyXG5cclxuICAgICAgICB0aGlzLnByb3BzLnNldHRpbmdzLnByZXZpZXcgPSB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgY2hhbmdlVGFiKHRhYil7XHJcbiAgICAgICAgbGV0IGFuY2llbnRUYWIgPSB0aGlzLnN0YXRlLmFjdGl2ZVxyXG4gICAgICAgIGlmKGFuY2llbnRUYWIgPT09IHRhYi5wcm9wcy5pZClyZXR1cm5cclxuXHJcbiAgICAgICAgdGhpcy50YWJzLmZvckVhY2goZSA9PiB7XHJcbiAgICAgICAgICAgIGUuc2V0QWN0aXZlKGZhbHNlKVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGFiLnNldEFjdGl2ZSh0cnVlKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6IHRhYi5wcm9wcy5pZFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCl7XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT1cImxjLXRhYldyYXBwZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJsYy10YWJuYXZcIiBzdHlsZT17e2ZsZXg6IFwiMCAxIGF1dG9cIn19PlxyXG4gICAgICAgICAgICAgICAgPFRhYiBwcmV2aWV3PXt0aGlzfSB0aXRsZT1cIkZ1bGwgUHJvZmlsZVwiIGlkPVwicHJvZmlsZVwiLz5cclxuICAgICAgICAgICAgICAgIDxUYWIgcHJldmlldz17dGhpc30gdGl0bGU9XCJVc2VyIFBvcG91dFwiIGlkPVwicG9wb3V0XCIvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPFByZXNlbmNlRXJyb3JDYXRjaGVyIHByZXZpZXc9e3RoaXMucHJldmlld30gc3RhdGU9e3RoaXMuc3RhdGUucnBjfSBwcm9wcz17e3ByZXZpZXc6IHRoaXN9fSBrZXk9e3RoaXMuc3RhdGUuYWN0aXZlfSAvPlxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH0gICBcclxuXHJcbiAgICBpc0FjdGl2ZSh0YWIpe1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gdGFiXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHByZXZpZXcoKXtcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSA9PT0gXCJwcm9maWxlXCIpcmV0dXJuIFByb2ZpbGVcclxuICAgICAgICByZXR1cm4gUG9wb3V0XHJcbiAgICB9XHJcbn1cclxuXHJcbmNsYXNzIFRhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcyl7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpXHJcblxyXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgIGFjdGl2ZTogcHJvcHMucHJldmlldy5pc0FjdGl2ZShwcm9wcy5pZClcclxuICAgICAgICB9XHJcbiAgICAgICAgcHJvcHMucHJldmlldy50YWJzLnB1c2godGhpcylcclxuICAgIH1cclxuXHJcbiAgICBzZXRBY3RpdmUoaXNBY3RpdmUpe1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBhY3RpdmU6ICEhaXNBY3RpdmVcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBgbGMtbmF2SXRlbWBcclxuICAgICAgICBpZih0aGlzLnN0YXRlLmFjdGl2ZSl7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1BY3RpdmVgXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGNsYXNzTmFtZSArPSBgIGxjLW5hdkl0ZW1JbmFjdGl2ZWBcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuICg8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfSBvbkNsaWNrPXsoKT0+e1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnByZXZpZXcuY2hhbmdlVGFiKHRoaXMpXHJcbiAgICAgICAgfX0+XHJcbiAgICAgICAgICAgIHt0aGlzLnByb3BzLnRpdGxlfVxyXG4gICAgICAgIDwvZGl2PilcclxuICAgIH1cclxufVxyXG5cclxubGV0IGVtcHR5Q2xhc3Nlc1xyXG5jbGFzcyBQcmVzZW5jZUVycm9yQ2F0Y2hlciBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XHJcbiAgICBjb21wb25lbnREaWRDYXRjaChlcnIsIGVyckluZm8pe1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyLCBlcnJJbmZvKVxyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICBlcnJvcjogdHJ1ZVxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcbiAgICByZW5kZXIoKXtcclxuICAgICAgICBpZighdGhpcy5zdGF0ZSl7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSB7XHJcbiAgICAgICAgICAgICAgICBlcnJvcjogZmFsc2VcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZighdGhpcy5zdGF0ZS5lcnJvcil7XHJcbiAgICAgICAgICAgIHRyeXtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpZXcgPSBuZXcgdGhpcy5wcm9wcy5wcmV2aWV3KHRoaXMucHJvcHMucHJvcHMpXHJcbiAgICAgICAgICAgICAgICBwcmV2aWV3LnNldFN0YXRlKHRoaXMucHJvcHMuc3RhdGUpXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlldy5yZW5kZXIoKVxyXG4gICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZS5lcnJvciA9IHRydWVcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcigpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZW1wdHlDbGFzc2VzID0gZW1wdHlDbGFzc2VzIHx8IEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZW1wdHlTdGF0ZUltYWdlICYmIGUuZW1wdHlTdGF0ZSlcclxuICAgICAgICAgICAgaWYoIWVtcHR5Q2xhc3Nlcyl7XHJcbiAgICAgICAgICAgICAgICBVdGlscy5zaG93VG9hc3QoXCJBbiBlcnJvciBvY2N1cmVkLiBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLlwiKVxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gPGRpdiBzdHlsZT17e1xyXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBcIjIwcHhcIlxyXG4gICAgICAgICAgICB9fT5cclxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9e3tcclxuICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwidmFyKC0tYmFja2dyb3VuZC1wcmltYXJ5KVwiLCBcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIjMwcHggMzBweFwiLCBcclxuICAgICAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6IFwiOHB4XCJcclxuICAgICAgICAgICAgICAgIH19IGNsYXNzTmFtZT17YGxjLXRhYi1ib3gtc2hhZG93ICR7ZW1wdHlDbGFzc2VzLmVtcHR5U3RhdGV9YH0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSW1hZ2V9IHN0eWxlPXt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpblRvcDogXCIyMHB4XCJcclxuICAgICAgICAgICAgICAgICAgICB9fT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e2VtcHR5Q2xhc3Nlcy5lbXB0eVN0YXRlSGVhZGVyfT5BbiBlcnJvciBvY2N1cmVkPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPXtlbXB0eUNsYXNzZXMuZW1wdHlTdGF0ZVN1YnRleHR9PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb25zLiBKb2luIG91ciDCrVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzc05hbWU9e2Ake0JEVjIuYW5jaG9yQ2xhc3Nlcy5hbmNob3J9ICR7QkRWMi5hbmNob3JDbGFzc2VzLmFuY2hvclVuZGVybGluZU9uSG92ZXJ9YH0gcm9sZT1cImJ1dHRvblwiIHRhYmluZGV4PXswfSBvbkNsaWNrPXsoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLmpvaW5MQygpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH19PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBzZXJ2ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICDCrSBmb3IgaGVscC5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgcG9wb3V0TW9kdWxlc1xyXG5sZXQgVXNlclBvcG91dENvbXBvbmVudFxyXG5sZXQgUG9wb3V0UHJvcHNcclxuY2xhc3MgUG9wb3V0IGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHBvcG91dE1vZHVsZXMgfHwgKHBvcG91dE1vZHVsZXMgPSBbXHJcbiAgICAgICAgICAgIEJEVjIuV2VicGFja01vZHVsZXMuZmluZChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZGlzcGxheU5hbWUgPT09IFwiVXNlclBvcG91dFwiKSxcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIGdldENvbXBvbmVudCgpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIFVzZXJQb3BvdXQsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCgpID0+IHtcclxuICAgICAgICAgICAgbGV0IHJlbmRlcjEgPSBVc2VyUG9wb3V0LmRlZmF1bHQoe1xyXG4gICAgICAgICAgICAgICAgdXNlcklkOiB1c2VyLmlkLCBcclxuICAgICAgICAgICAgICAgIGd1aWxkSWQ6IG51bGwsIFxyXG4gICAgICAgICAgICAgICAgY2hhbm5lbElkOiBudWxsLCBcclxuICAgICAgICAgICAgICAgIGRpc2FibGVVc2VyUHJvZmlsZUxpbms6IHRydWVcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgVXNlclBvcG91dENvbXBvbmVudCA9IHJlbmRlcjEudHlwZVxyXG4gICAgICAgICAgICBQb3BvdXRQcm9wcyA9IHJlbmRlcjEucHJvcHNcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyKClcclxuICAgICAgICB9LCBudWxsKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGlmKCFVc2VyUG9wb3V0Q29tcG9uZW50KXJldHVybiB0aGlzLmdldENvbXBvbmVudCgpXHJcbiAgICAgICAgbGV0IFtcclxuICAgICAgICAgICAgX1VzZXJQb3BvdXQsXHJcbiAgICAgICAgICAgIHVzZXJNb2R1bGVcclxuICAgICAgICBdID0gdGhpcy5tb2R1bGVzXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXIgPSB1c2VyTW9kdWxlLmRlZmF1bHQuZ2V0Q3VycmVudFVzZXIoKVxyXG5cclxuICAgICAgICBsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSUEMsIHRoaXMucHJvcHMucHJldmlldy5wcm9wcy5zZXR0aW5ncy5zdGF0ZS5kYXRhKVxyXG4gICAgICAgIGNvbnN0IGFjdGl2aXR5ID0gKGZ1bmN0aW9uKCl7XHJcbiAgICAgICAgICAgIGlmKCF0aGlzLmdhbWUpcmV0dXJuIG51bGxcclxuICAgICAgICAgICAgbGV0IGdhbWUgPSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmdhbWUubmFtZSB8fCBkZWZhdWx0UlBDLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbl9pZDogdGhpcy5nYW1lLmFwcGxpY2F0aW9uX2lkIHx8IGRlZmF1bHRSUEMuYXBwbGljYXRpb25faWQsXHJcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmdhbWUuZGV0YWlscyB8fCB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBzdGF0ZTogdGhpcy5nYW1lLnN0YXRlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcHM6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl0gPyB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuZ2FtZVtcInRpbWVzdGFtcHMuc3RhcnRcIl1cclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICBhc3NldHM6IHRoaXMuZ2FtZVtcImFzc2V0cy5sYXJnZVwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBsYXJnZV9pbWFnZTogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNtYWxsX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMuc21hbGxcIl0gfHwgdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICB9IDogdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBnYW1lXHJcbiAgICAgICAgfSkuY2FsbCh7XHJcbiAgICAgICAgICAgIGdhbWU6IGRhdGFcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICBjb25zdCBwb3BvdXQgPSBuZXcgVXNlclBvcG91dENvbXBvbmVudChPYmplY3QuYXNzaWduKHt9LCBQb3BvdXRQcm9wcywge1xyXG4gICAgICAgICAgICBhY3Rpdml0eTogYWN0aXZpdHksXHJcbiAgICAgICAgICAgIHVzZXJJZDogdXNlci5pZFxyXG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcclxuXHJcbiAgICAgICAgLy8gcmVtb3ZlIHRoZSBzdG9wIHByb3BhZ2F0aW9uIHNoaXQuXHJcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gPGRpdiB7Li4ud2luZG93LkxpZ2h0Y29yZC5BcGkuXy5leGNsdWRlUHJvcGVydGllcyhwb3BvdXQucHJvcHMsIFtcIm9uQ2xpY2tcIiwgXCJvbkNvbnRleHRNZW51XCJdKX0gLz5cclxuXHJcbiAgICAgICAgcmV0dXJuIDxkaXYgY2xhc3NOYW1lPVwibGMtdXNlclBvcG91dCBsYy10YWItYm94LXNoYWRvd1wiPlxyXG4gICAgICAgICAgICB7Y29udGFpbmVyfVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG59XHJcblxyXG5sZXQgcHJvZmlsZU1vZHVsZXNcclxubGV0IFVzZXJQcm9maWxlQ29tcG9uZW50XHJcbmxldCBQcm9maWxlUHJvcHNcclxubGV0IGNvbm5lY3RlZFByb2ZpbGVTdG9yZVxyXG5jbGFzcyBQcm9maWxlIGV4dGVuZHMgUmVhY3QuQ29tcG9uZW50IHtcclxuICAgIGdldCBtb2R1bGVzKCl7XHJcbiAgICAgICAgcmV0dXJuIHByb2ZpbGVNb2R1bGVzIHx8IChwcm9maWxlTW9kdWxlcyA9IFtcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5kaXNwbGF5TmFtZSA9PT0gXCJVc2VyUHJvZmlsZVwiKSxcclxuICAgICAgICAgICAgQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kKGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDdXJyZW50VXNlcilcclxuICAgICAgICBdKVxyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpe1xyXG4gICAgICAgIGxldCBbXHJcbiAgICAgICAgICAgIFVzZXJQcm9maWxlLFxyXG4gICAgICAgICAgICB1c2VyTW9kdWxlXHJcbiAgICAgICAgXSA9IHRoaXMubW9kdWxlc1xyXG5cclxuICAgICAgICBjb25zdCB1c2VyID0gdXNlck1vZHVsZS5kZWZhdWx0LmdldEN1cnJlbnRVc2VyKClcclxuICAgICAgICBpZighVXNlclByb2ZpbGVDb21wb25lbnQpe1xyXG4gICAgICAgICAgICBjb25zdCByZW5kZXIxID0gbmV3IFVzZXJQcm9maWxlLmRlZmF1bHQoe1xyXG4gICAgICAgICAgICAgICAgdXNlcjogdXNlclxyXG4gICAgICAgICAgICB9KS5yZW5kZXIoKVxyXG4gICAgICAgICAgICBjb25uZWN0ZWRQcm9maWxlU3RvcmUgPSByZW5kZXIxLnR5cGVcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMiA9IG5ldyByZW5kZXIxLnR5cGUocmVuZGVyMS5wcm9wcykucmVuZGVyKClcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyMyA9IHJlbmRlcjIudHlwZS5yZW5kZXIocmVuZGVyMi5wcm9wcywgbnVsbClcclxuICAgICAgICAgICAgY29uc3QgcmVuZGVyNCA9IG5ldyByZW5kZXIzLnR5cGUocmVuZGVyMy5wcm9wcykucmVuZGVyKClcclxuICAgICAgICAgICAgVXNlclByb2ZpbGVDb21wb25lbnQgPSByZW5kZXI0LnR5cGVcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoIVVzZXJQcm9maWxlQ29tcG9uZW50KXRocm93IG5ldyBFcnJvcihgQ291bGRuJ3QgZmluZCB0aGUgVXNlclByb2ZpbGVDb21wb25lbnQgY29tcG9uZW50LmApXHJcblxyXG4gICAgICAgIGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJQQywgdGhpcy5wcm9wcy5wcmV2aWV3LnByb3BzLnNldHRpbmdzLnN0YXRlLmRhdGEpXHJcbiAgICAgICAgY29uc3QgYWN0aXZpdHkgPSAoZnVuY3Rpb24oKXtcclxuICAgICAgICAgICAgaWYoIXRoaXMuZ2FtZSlyZXR1cm4gbnVsbFxyXG4gICAgICAgICAgICBsZXQgZ2FtZSA9IHtcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuZ2FtZS5uYW1lIHx8IGRlZmF1bHRSUEMubmFtZSxcclxuICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uX2lkOiB0aGlzLmdhbWUuYXBwbGljYXRpb25faWQgfHwgZGVmYXVsdFJQQy5hcHBsaWNhdGlvbl9pZCxcclxuICAgICAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZ2FtZS5kZXRhaWxzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIHN0YXRlOiB0aGlzLmdhbWUuc3RhdGUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wczogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXSA/IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5nYW1lW1widGltZXN0YW1wcy5zdGFydFwiXVxyXG4gICAgICAgICAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgIGFzc2V0czogdGhpcy5nYW1lW1wiYXNzZXRzLmxhcmdlXCJdID8ge1xyXG4gICAgICAgICAgICAgICAgICAgIGxhcmdlX2ltYWdlOiB0aGlzLmdhbWVbXCJhc3NldHMubGFyZ2VcIl0sXHJcbiAgICAgICAgICAgICAgICAgICAgc21hbGxfaW1hZ2U6IHRoaXMuZ2FtZVtcImFzc2V0cy5zbWFsbFwiXSB8fCB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0gOiB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICB0eXBlOiAwXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIGdhbWVcclxuICAgICAgICB9KS5jYWxsKHtcclxuICAgICAgICAgICAgZ2FtZTogZGF0YVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIFByb2ZpbGVQcm9wcyA9IG5ldyBjb25uZWN0ZWRQcm9maWxlU3RvcmUoe1xyXG4gICAgICAgICAgICB1c2VyOiB1c2VyLFxyXG4gICAgICAgICAgICBjbG9zZTogKCkgPT4ge31cclxuICAgICAgICB9KS5yZW5kZXIoKS5wcm9wc1xyXG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBuZXcgVXNlclByb2ZpbGVDb21wb25lbnQoT2JqZWN0LmFzc2lnbih7fSwgUHJvZmlsZVByb3BzLCB7XHJcbiAgICAgICAgICAgIGFjdGl2aXR5OiBhY3Rpdml0eVxyXG4gICAgICAgIH0pKS5yZW5kZXIoKS5wcm9wcy5jaGlsZHJlbiAvLyBieXBhc3MgdHJhY2tpbmdcclxuXHJcbiAgICAgICAgcHJvZmlsZS5wcm9wcy5zdHlsZSA9IHtcclxuICAgICAgICAgICAgd2lkdGg6IFwiYXV0b1wiXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gPGRpdiBjbGFzc05hbWU9XCJsYy10YWIgbGMtdGFiLWJveC1zaGFkb3dcIj5cclxuICAgICAgICAgICAge3Byb2ZpbGV9XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5pbXBvcnQgRE9NIGZyb20gXCIuLi8uLi9tb2R1bGVzL2RvbXRvb2xzXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfTGF5ZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLmtleXVwTGlzdGVuZXIgPSB0aGlzLmtleXVwTGlzdGVuZXIuYmluZCh0aGlzKTtcclxuICAgIH1cclxuXHJcbiAgICBrZXl1cExpc3RlbmVyKGUpIHtcclxuICAgICAgICBpZiAoZS53aGljaCA9PT0gMjcpIHtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdERvbS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMucmVmcy5yb290LnBhcmVudE5vZGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIHRoaXMua2V5dXBMaXN0ZW5lcik7XHJcblxyXG4gICAgICAgIGNvbnN0IHRoaXNOb2RlID0gRE9NLnF1ZXJ5KGAjJHt0aGlzLnByb3BzLmlkfWApO1xyXG4gICAgICAgIERPTS5hbmltYXRlKHtcclxuICAgICAgICAgICAgZHVyYXRpb246IDIwMCxcclxuICAgICAgICAgICAgdXBkYXRlOiBmdW5jdGlvbihwcm9ncmVzcykge1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7MS4xIC0gMC4xICogcHJvZ3Jlc3N9KSB0cmFuc2xhdGVaKDBweClgO1xyXG4gICAgICAgICAgICAgICAgdGhpc05vZGUuc3R5bGUub3BhY2l0eSA9IHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xyXG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgdGhpcy5rZXl1cExpc3RlbmVyKTtcclxuXHJcbiAgICAgICAgY29uc3QgdGhpc05vZGUgPSBET00ucXVlcnkoYCMke3RoaXMucHJvcHMuaWR9YCk7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHsxLjEgLSAwLjEgKiAoMSAtIHByb2dyZXNzKX0pIHRyYW5zbGF0ZVooMHB4KWA7XHJcbiAgICAgICAgICAgICAgICB0aGlzTm9kZS5zdHlsZS5vcGFjaXR5ID0gMSAtIHByb2dyZXNzO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByb2dyZXNzID09IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzTm9kZS5yZW1vdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBjb25zdCBsYXllciA9IERPTS5xdWVyeShcIi5wdWJsaWNTZXJ2ZXJzT3BlblwiKTtcclxuICAgICAgICBsYXllci5jbGFzc0xpc3QucmVtb3ZlKFwicHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHswLjA3ICogcHJvZ3Jlc3MgKyAwLjkzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSBwcm9ncmVzcztcclxuICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcyA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0SW1tZWRpYXRlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUudHJhbnNmb3JtID0gXCJcIjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXIuc3R5bGUub3BhY2l0eSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3QgbGF5ZXIgPSBET00ucXVlcnkoXCJbY2xhc3MqPVxcXCJsYXllci1cXFwiXVwiKTtcclxuICAgICAgICBsYXllci5jbGFzc0xpc3QuYWRkKFwicHVibGljU2VydmVyc09wZW5cIik7XHJcbiAgICAgICAgRE9NLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxyXG4gICAgICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKHByb2dyZXNzKSB7XHJcbiAgICAgICAgICAgICAgICBsYXllci5zdHlsZS50cmFuc2Zvcm0gPSBgc2NhbGUoJHswLjA3ICogKDEgLSBwcm9ncmVzcykgKyAwLjkzfSkgdHJhbnNsYXRlWigwcHgpYDtcclxuICAgICAgICAgICAgICAgIGxheWVyLnN0eWxlLm9wYWNpdHkgPSAxIC0gcHJvZ3Jlc3M7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJsYXllciBiZC1sYXllciBcIitCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllciAmJiBlLmFuaW1hdGluZylbMF0ubGF5ZXIsIGlkOiB0aGlzLnByb3BzLmlkLCByZWY6IFwicm9vdFwiLCBzdHlsZToge29wYWNpdHk6IDAsIHRyYW5zZm9ybTogXCJzY2FsZSgxLjEpIHRyYW5zbGF0ZVooMHB4KVwifX0sXHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMuY2hpbGRyZW5cclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBUb29scyBmcm9tIFwiLi4vdG9vbHNcIjtcclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4uL3NldHRpbmdzVGl0bGVcIjtcclxuaW1wb3J0IFRhYkJhclNlcGFyYXRvciBmcm9tIFwiLi4vdGFiQmFyU2VwYXJhdG9yXCI7XHJcbmltcG9ydCBUYWJCYXJIZWFkZXIgZnJvbSBcIi4uL3RhYkJhckhlYWRlclwiO1xyXG5pbXBvcnQgVGFiQmFySXRlbSBmcm9tIFwiLi4vdGFiQmFySXRlbVwiO1xyXG5cclxuaW1wb3J0IFNlcnZlckNhcmQgZnJvbSBcIi4vc2VydmVyQ2FyZFwiO1xyXG5pbXBvcnQgU2lkZWJhclZpZXcgZnJvbSBcIi4vc2lkZWJhclZpZXdcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19QdWJsaWNTZXJ2ZXJzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5zZXRJbml0aWFsU3RhdGUoKTtcclxuICAgICAgICB0aGlzLmNsb3NlID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlQ2F0ZWdvcnkgPSB0aGlzLmNoYW5nZUNhdGVnb3J5LmJpbmQodGhpcyk7XHJcbiAgICAgICAgdGhpcy5zZWFyY2ggPSB0aGlzLnNlYXJjaC5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuc2VhcmNoS2V5RG93biA9IHRoaXMuc2VhcmNoS2V5RG93bi5iaW5kKHRoaXMpO1xyXG4gICAgICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uID0gdGhpcy5jaGVja0Nvbm5lY3Rpb24uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmpvaW4gPSB0aGlzLmpvaW4uYmluZCh0aGlzKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3QgPSB0aGlzLmNvbm5lY3QuYmluZCh0aGlzKTtcclxuXHJcbiAgICAgICAgdGhpcy5HdWlsZFN0b3JlID0gQkRWMi5XZWJwYWNrTW9kdWxlcy5maW5kQnlVbmlxdWVQcm9wZXJ0aWVzKFtcImdldEd1aWxkc1wiXSk7XHJcbiAgICAgICAgdGhpcy5BdmF0YXJEZWZhdWx0cyA9IEJEVjIuV2VicGFja01vZHVsZXMuZmluZEJ5VW5pcXVlUHJvcGVydGllcyhbXCJnZXRVc2VyQXZhdGFyVVJMXCIsIFwiREVGQVVMVF9BVkFUQVJTXCJdKTtcclxuICAgICAgICB0aGlzLkludml0ZUFjdGlvbnMgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiYWNjZXB0SW52aXRlXCJdKTtcclxuICAgICAgICB0aGlzLlNvcnRlZEd1aWxkU3RvcmUgPSBCRFYyLldlYnBhY2tNb2R1bGVzLmZpbmRCeVVuaXF1ZVByb3BlcnRpZXMoW1wiZ2V0U29ydGVkR3VpbGRzXCJdKTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcclxuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbigpO1xyXG4gICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsU3RhdGUoKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRDYXRlZ29yeTogLTEsXHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkxvYWRpbmcuLi5cIixcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgc2VydmVyczogW10sXHJcbiAgICAgICAgICAgIG5leHQ6IG51bGwsXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgIHN0YXRlOiAwLFxyXG4gICAgICAgICAgICAgICAgdXNlcjogbnVsbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICBCRFYyLnJlYWN0RG9tLnVubW91bnRDb21wb25lbnRBdE5vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5wcm9wcy5yb290SWQpKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWFyY2gocXVlcnksIGNsZWFyKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgZmV0Y2goYCR7c2VsZi5lbmRQb2ludH0ke3F1ZXJ5fSR7cXVlcnkgPyBcIiZzY2hlbWE9bmV3XCIgOiBcIj9zY2hlbWE9bmV3XCJ9YCwge1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiZ2V0XCJcclxuICAgICAgICB9KS50aGVuKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgICAgIGlmKHJlcy5zdGF0dXMgIT09IDIwMCl0aHJvdyBhd2FpdCByZXMudGV4dCgpXHJcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKVxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHNlcnZlcnMgPSBkYXRhLnJlc3VsdHMucmVkdWNlKChhcnIsIHNlcnZlcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgc2VydmVyLmpvaW5lZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgYXJyLnB1c2goc2VydmVyKTtcclxuICAgICAgICAgICAgICAgIC8vIGFyci5wdXNoKDxTZXJ2ZXJDYXJkIHNlcnZlcj17c2VydmVyfSBqb2luPXtzZWxmLmpvaW59Lz4pO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycjtcclxuICAgICAgICAgICAgfSwgW10pO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFjbGVhcikge1xyXG4gICAgICAgICAgICAgICAgc2VydmVycyA9IHNlbGYuc3RhdGUuc2VydmVycy5jb25jYXQoc2VydmVycyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvL3NlcnZlcnMudW5zaGlmdChzZWxmLmJkU2VydmVyKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGVuZCA9IGRhdGEuc2l6ZSArIGRhdGEuZnJvbTtcclxuICAgICAgICAgICAgZGF0YS5uZXh0ID0gYD9mcm9tPSR7ZW5kfWA7XHJcbiAgICAgICAgICAgIGlmIChzZWxmLnN0YXRlLnRlcm0pIGRhdGEubmV4dCArPSBgJnRlcm09JHtzZWxmLnN0YXRlLnRlcm19YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSkgZGF0YS5uZXh0ICs9IGAmY2F0ZWdvcnk9JHtzZWxmLmNhdGVnb3J5QnV0dG9uc1tzZWxmLnN0YXRlLnNlbGVjdGVkQ2F0ZWdvcnldfWA7XHJcbiAgICAgICAgICAgIGlmIChlbmQgPj0gZGF0YS50b3RhbCkge1xyXG4gICAgICAgICAgICAgICAgZW5kID0gZGF0YS50b3RhbDtcclxuICAgICAgICAgICAgICAgIGRhdGEubmV4dCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGBTaG93aW5nIDEtJHtlbmR9IG9mICR7ZGF0YS50b3RhbH0gcmVzdWx0cyBpbiAke3NlbGYuY2F0ZWdvcnlCdXR0b25zW3NlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeV19YDtcclxuICAgICAgICAgICAgaWYgKHNlbGYuc3RhdGUudGVybSkgdGl0bGUgKz0gYCBmb3IgJHtzZWxmLnN0YXRlLnRlcm19YDtcclxuXHJcbiAgICAgICAgICAgIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsXHJcbiAgICAgICAgICAgICAgICBzZXJ2ZXJzOiBzZXJ2ZXJzLFxyXG4gICAgICAgICAgICAgICAgbmV4dDogZGF0YS5uZXh0XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGNsZWFyKSB7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKHNlbGYpO1xyXG4gICAgICAgICAgICAgICAgc2VsZi5yZWZzLnNidi5yZWZzLmNvbnRlbnRTY3JvbGxlci5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2V0U3RhdGUoe1xyXG4gICAgICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJGYWlsZWQgdG8gbG9hZCBzZXJ2ZXJzLiBDaGVjayBjb25zb2xlIGZvciBkZXRhaWxzXCJcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBqb2luKHNlcnZlckNhcmQpIHtcclxuICAgICAgICBpZiAoc2VydmVyQ2FyZC5wcm9wcy5waW5uZWQpIHJldHVybiB0aGlzLkludml0ZUFjdGlvbnMuYWNjZXB0SW52aXRlKHNlcnZlckNhcmQucHJvcHMuaW52aXRlX2NvZGUpO1xyXG5cclxuICAgICAgICBhd2FpdCBmZXRjaChgJHt0aGlzLmpvaW5FbmRQb2ludH0vJHtzZXJ2ZXJDYXJkLnByb3BzLnNlcnZlci5pZGVudGlmaWVyfWAse1xyXG4gICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiBcImluY2x1ZGVcIixcclxuICAgICAgICAgICAgbW9kZTogXCJjb3JzXCIsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgIFwiQWNjZXB0XCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxyXG4gICAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBzZXJ2ZXJDYXJkLnNldFN0YXRlKHtqb2luZWQ6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25uZWN0KCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBzZWxmLndpbmRvd09wdGlvbnM7XHJcbiAgICAgICAgb3B0aW9ucy54ID0gTWF0aC5yb3VuZCh3aW5kb3cuc2NyZWVuWCArIHdpbmRvdy5pbm5lcldpZHRoIC8gMiAtIG9wdGlvbnMud2lkdGggLyAyKTtcclxuICAgICAgICBvcHRpb25zLnkgPSBNYXRoLnJvdW5kKHdpbmRvdy5zY3JlZW5ZICsgd2luZG93LmlubmVySGVpZ2h0IC8gMiAtIG9wdGlvbnMuaGVpZ2h0IC8gMik7XHJcblxyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdyA9IG5ldyAod2luZG93LnJlcXVpcmUoXCJlbGVjdHJvblwiKS5yZW1vdGUuQnJvd3NlcldpbmRvdykob3B0aW9ucyk7XHJcbiAgICAgICAgY29uc3QgdXJsID0gXCJodHRwczovL2F1dGguZGlzY29yZHNlcnZlcnMuY29tL2Nvbm5lY3Q/c2NvcGVzPWd1aWxkcy5qb2luJnByZXZpb3VzVXJsPWh0dHBzOi8vYXV0aC5kaXNjb3Jkc2VydmVycy5jb20vaW5mb1wiO1xyXG4gICAgICAgIHNlbGYuam9pbldpbmRvdy53ZWJDb250ZW50cy5vbihcImRpZC1uYXZpZ2F0ZVwiLCAoZXZlbnQsIHVybCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAodXJsICE9IFwiaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvXCIpIHJldHVybjtcclxuICAgICAgICAgICAgc2VsZi5qb2luV2luZG93LmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHNlbGYuY2hlY2tDb25uZWN0aW9uKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgc2VsZi5qb2luV2luZG93LmxvYWRVUkwodXJsKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgd2luZG93T3B0aW9ucygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICB3aWR0aDogNTAwLFxyXG4gICAgICAgICAgICBoZWlnaHQ6IDU1MCxcclxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiBcIiMyODJiMzBcIixcclxuICAgICAgICAgICAgc2hvdzogdHJ1ZSxcclxuICAgICAgICAgICAgcmVzaXphYmxlOiBmYWxzZSxcclxuICAgICAgICAgICAgbWF4aW1pemFibGU6IGZhbHNlLFxyXG4gICAgICAgICAgICBtaW5pbWl6YWJsZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGFsd2F5c09uVG9wOiB0cnVlLFxyXG4gICAgICAgICAgICBmcmFtZTogZmFsc2UsXHJcbiAgICAgICAgICAgIGNlbnRlcjogZmFsc2UsXHJcbiAgICAgICAgICAgIHdlYlByZWZlcmVuY2VzOiB7XHJcbiAgICAgICAgICAgICAgICBub2RlSW50ZWdyYXRpb246IGZhbHNlXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBiZFNlcnZlcigpIHtcclxuICAgICAgICBjb25zdCBzZXJ2ZXIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiQmV0dGVyRGlzY29yZFwiLFxyXG4gICAgICAgICAgICBvbmxpbmU6IFwiNzUwMCtcIixcclxuICAgICAgICAgICAgbWVtYmVyczogXCIyMDAwMCtcIixcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBCZXR0ZXJEaXNjb3JkIHNlcnZlciBmb3Igc3VwcG9ydCBldGNcIixcclxuICAgICAgICAgICAgaWRlbnRpZmllcjogXCI4NjAwNDc0NDk2NjkxNDA0OFwiLFxyXG4gICAgICAgICAgICBpY29uVXJsOiBcImh0dHBzOi8vY2RuLmRpc2NvcmRhcHAuY29tL2ljb25zLzg2MDA0NzQ0OTY2OTE0MDQ4LzI5MmU3ZjZiZmZmMmI3MWRmZDEzZTUwOGE4NTlhZWRkLndlYnBcIixcclxuICAgICAgICAgICAgbmF0aXZlam9pbjogdHJ1ZSxcclxuICAgICAgICAgICAgaW52aXRlX2NvZGU6IFwiMFRtZm81WmJPUkNScWJBZFwiLFxyXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IHNlcnZlcjIgPSB7XHJcbiAgICAgICAgICAgIG5hbWU6IFwiTGlnaHRjb3JkXCIsXHJcbiAgICAgICAgICAgIG9ubGluZTogXCIzMCtcIixcclxuICAgICAgICAgICAgbWVtYmVyczogXCI1MCtcIixcclxuICAgICAgICAgICAgY2F0ZWdvcmllczogW1wiY29tbXVuaXR5XCIsIFwicHJvZ3JhbW1pbmdcIiwgXCJzdXBwb3J0XCJdLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJPZmZpY2lhbCBMaWdodGNvcmQgc2VydmVyIGZvciBzdXBwb3J0IGV0Y1wiLFxyXG4gICAgICAgICAgICBpZGVudGlmaWVyOiBcIjg2MDA0NzQ0OTY2OTE0MDQ4XCIsXHJcbiAgICAgICAgICAgIGljb25Vcmw6IFwiaHR0cHM6Ly9hdmF0YXJzMy5naXRodWJ1c2VyY29udGVudC5jb20vdS82NTY5MDA1OD9zPTIwMCZ2PTRcIixcclxuICAgICAgICAgICAgbmF0aXZlam9pbjogdHJ1ZSxcclxuICAgICAgICAgICAgaW52aXRlX2NvZGU6IFwiN2VGZmYyQVwiLFxyXG4gICAgICAgICAgICBwaW5uZWQ6IHRydWVcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IGd1aWxkTGlzdCA9IHRoaXMuU29ydGVkR3VpbGRTdG9yZS5nZXRGbGF0dGVuZWRHdWlsZElkcygpO1xyXG4gICAgICAgIGNvbnN0IGRlZmF1bHRMaXN0ID0gdGhpcy5BdmF0YXJEZWZhdWx0cy5ERUZBVUxUX0FWQVRBUlM7XHJcbiAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtzZXJ2ZXI6IHNlcnZlcjIsIHBpbm5lZDogdHJ1ZSwgam9pbjogdGhpcy5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2VydmVyQ2FyZCwge3NlcnZlcjogc2VydmVyLCBwaW5uZWQ6IHRydWUsIGpvaW46IHRoaXMuam9pbiwgZ3VpbGRMaXN0OiBndWlsZExpc3QsIGZhbGxiYWNrOiBkZWZhdWx0TGlzdFtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1KV19KVxyXG4gICAgICAgIF1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZW5kUG9pbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIFwiaHR0cHM6Ly9zZWFyY2guZGlzY29yZHNlcnZlcnMuY29tXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGpvaW5FbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL2ouZGlzY29yZHNlcnZlcnMuY29tXCI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNvbm5lY3RFbmRQb2ludCgpIHtcclxuICAgICAgICByZXR1cm4gXCJodHRwczovL2pvaW4uZGlzY29yZHNlcnZlcnMuY29tL2Nvbm5lY3RcIjtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBjaGVja0Nvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hdXRoLmRpc2NvcmRzZXJ2ZXJzLmNvbS9pbmZvYCx7XHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXHJcbiAgICAgICAgICAgICAgICBjcmVkZW50aWFsczogXCJpbmNsdWRlXCIsXHJcbiAgICAgICAgICAgICAgICBtb2RlOiBcImNvcnNcIixcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcclxuICAgICAgICAgICAgICAgICAgICBcIkFjY2VwdFwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcclxuICAgICAgICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIlxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAwLFxyXG4gICAgICAgICAgICAgICAgY29ubmVjdGlvbjoge1xyXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAyLFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXI6IGRhdGFcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHNlbGYuc2VhcmNoKFwiXCIsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcilcclxuICAgICAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgICAgICB0aXRsZTogXCJOb3QgY29ubmVjdGVkIHRvIGRpc2NvcmRzZXJ2ZXJzLmNvbSFcIixcclxuICAgICAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZENhdGVnb3J5OiAtMSxcclxuICAgICAgICAgICAgICAgIGNvbm5lY3Rpb246IHtcclxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogMSxcclxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBudWxsXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTaWRlYmFyVmlldywge3JlZjogXCJzYnZcIn0sIHRoaXMuY29tcG9uZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29tcG9uZW50KCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNpZGViYXI6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5zaWRlYmFyXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbnRlbnQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbXBvbmVudDogdGhpcy5jb250ZW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHRvb2xzOiB7XHJcbiAgICAgICAgICAgICAgICBjb21wb25lbnQ6IEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUb29scywge2tleTogXCJwdFwiLCByZWY6IFwidG9vbHNcIiwgb25DbGljazogdGhpcy5jbG9zZX0pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzaWRlYmFyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2lkZWJhclwiLCBrZXk6IFwicHNcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXIgU0lERVwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1oZWFkZXJcIiwgc3R5bGU6IHtmb250U2l6ZTogXCIxNnB4XCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICBcIlB1YmxpYyBTZXJ2ZXJzXCJcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoSW5wdXQsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChUYWJCYXJIZWFkZXIsIHt0ZXh0OiBcIkNhdGVnb3JpZXNcIn0pLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeUJ1dHRvbnMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhckl0ZW0sIHtpZDogaW5kZXgsIG9uQ2xpY2s6IHRoaXMuY2hhbmdlQ2F0ZWdvcnksIGtleTogaW5kZXgsIHRleHQ6IHZhbHVlLCBzZWxlY3RlZDogdGhpcy5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5ID09PSBpbmRleH0pO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoVGFiQmFyU2VwYXJhdG9yLCBudWxsKSxcclxuICAgICAgICAgICAgICAgIHRoaXMuZm9vdGVyLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzZWFyY2hJbnB1dCgpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWZvcm0taXRlbVwifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktdGV4dC1pbnB1dCBmbGV4LXZlcnRpY2FsXCIsIHN0eWxlOiB7d2lkdGg6IFwiMTcycHhcIiwgbWFyZ2luTGVmdDogXCIxMHB4XCJ9fSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImlucHV0XCIsIHtyZWY6IFwic2VhcmNoaW5wdXRcIiwgb25LZXlEb3duOiB0aGlzLnNlYXJjaEtleURvd24sIG9uQ2hhbmdlOiAoKSA9PiB7fSwgdHlwZTogXCJ0ZXh0XCIsIGNsYXNzTmFtZTogXCJpbnB1dCBkZWZhdWx0XCIsIHBsYWNlaG9sZGVyOiBcIlNlYXJjaC4uLlwiLCBtYXhMZW5ndGg6IFwiNTBcIn0pXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHNlYXJjaEtleURvd24oZSkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmxvYWRpbmcgfHwgZS53aGljaCAhPT0gMTMpIHJldHVybjtcclxuICAgICAgICBzZWxmLnNldFN0YXRlKHtcclxuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcclxuICAgICAgICAgICAgdGl0bGU6IFwiTG9hZGluZy4uLlwiLFxyXG4gICAgICAgICAgICB0ZXJtOiBlLnRhcmdldC52YWx1ZVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGxldCBxdWVyeSA9IGA/dGVybT0ke2UudGFyZ2V0LnZhbHVlfWA7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUuc2VsZWN0ZWRDYXRlZ29yeSAhPT0gMCkge1xyXG4gICAgICAgICAgICBxdWVyeSArPSBgJmNhdGVnb3J5PSR7c2VsZi5jYXRlZ29yeUJ1dHRvbnNbc2VsZi5zdGF0ZS5zZWxlY3RlZENhdGVnb3J5XX1gO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZWxmLnNlYXJjaChxdWVyeSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGNhdGVnb3J5QnV0dG9ucygpIHtcclxuICAgICAgICByZXR1cm4gW1wiQWxsXCIsIFwiRlBTIEdhbWVzXCIsIFwiTU1PIEdhbWVzXCIsIFwiU3RyYXRlZ3kgR2FtZXNcIiwgXCJNT0JBIEdhbWVzXCIsIFwiUlBHIEdhbWVzXCIsIFwiVGFibGV0b3AgR2FtZXNcIiwgXCJTYW5kYm94IEdhbWVzXCIsIFwiU2ltdWxhdGlvbiBHYW1lc1wiLCBcIk11c2ljXCIsIFwiQ29tbXVuaXR5XCIsIFwiTGFuZ3VhZ2VcIiwgXCJQcm9ncmFtbWluZ1wiLCBcIk90aGVyXCJdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoYW5nZUNhdGVnb3J5KGlkKSB7XHJcbiAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICAgICAgaWYgKHNlbGYuc3RhdGUubG9hZGluZykgcmV0dXJuO1xyXG4gICAgICAgIHNlbGYucmVmcy5zZWFyY2hpbnB1dC52YWx1ZSA9IFwiXCI7XHJcbiAgICAgICAgc2VsZi5zZXRTdGF0ZSh7XHJcbiAgICAgICAgICAgIGxvYWRpbmc6IHRydWUsXHJcbiAgICAgICAgICAgIHNlbGVjdGVkQ2F0ZWdvcnk6IGlkLFxyXG4gICAgICAgICAgICB0aXRsZTogXCJMb2FkaW5nLi4uXCIsXHJcbiAgICAgICAgICAgIHRlcm06IG51bGxcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAoaWQgPT09IDApIHtcclxuICAgICAgICAgICAgc2VsZi5zZWFyY2goXCJcIiwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgc2VsZi5zZWFyY2goYD9jYXRlZ29yeT0ke3NlbGYuY2F0ZWdvcnlCdXR0b25zW2lkXX1gLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgY29udGVudCgpIHtcclxuICAgICAgICBjb25zdCBzZWxmID0gdGhpcztcclxuICAgICAgICBjb25zdCBndWlsZExpc3QgPSB0aGlzLlNvcnRlZEd1aWxkU3RvcmUuZ2V0RmxhdHRlbmVkR3VpbGRJZHMoKTtcclxuICAgICAgICBjb25zdCBkZWZhdWx0TGlzdCA9IHRoaXMuQXZhdGFyRGVmYXVsdHMuREVGQVVMVF9BVkFUQVJTO1xyXG4gICAgICAgIGlmIChzZWxmLnN0YXRlLmNvbm5lY3Rpb24uc3RhdGUgPT09IDEpIHJldHVybiBzZWxmLm5vdENvbm5lY3RlZDtcclxuICAgICAgICBsZXQgY29sdW1uTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuY29udGVudENvbHVtbkRlZmF1bHQpWzBdXHJcbiAgICAgICAgcmV0dXJuIFtCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtyZWY6IFwiY29udGVudFwiLCBrZXk6IFwicGNcIiwgY2xhc3NOYW1lOiBjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBcIitjb2x1bW5Nb2R1bGUuY29udGVudENvbHVtbitcIiBjb250ZW50LWNvbHVtbiBkZWZhdWx0XCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2V0dGluZ3NUaXRsZSwge3RleHQ6IHNlbGYuc3RhdGUudGl0bGV9KSxcclxuICAgICAgICAgICAgc2VsZi5iZFNlcnZlcixcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLm1hcCgoc2VydmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNlcnZlckNhcmQsIHtrZXk6IHNlcnZlci5pZGVudGlmaWVyLCBzZXJ2ZXI6IHNlcnZlciwgam9pbjogc2VsZi5qb2luLCBndWlsZExpc3Q6IGd1aWxkTGlzdCwgZmFsbGJhY2s6IGRlZmF1bHRMaXN0W01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDUpXX0pO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5uZXh0ICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgb25DbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5zdGF0ZS5sb2FkaW5nKSByZXR1cm47c2VsZi5zZXRTdGF0ZSh7bG9hZGluZzogdHJ1ZX0pOyBzZWxmLnNlYXJjaChzZWxmLnN0YXRlLm5leHQsIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCBjbGFzc05hbWU6IFwidWktYnV0dG9uIGZpbGxlZCBicmFuZCBzbWFsbCBncm93XCIsIHN0eWxlOiB7d2lkdGg6IFwiMTAwJVwiLCBtYXJnaW5Ub3A6IFwiMTBweFwiLCBtYXJnaW5Cb3R0b206IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlLmxvYWRpbmcgPyBcIkxvYWRpbmdcIiA6IFwiTG9hZCBNb3JlXCJcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgc2VsZi5zdGF0ZS5zZXJ2ZXJzLmxlbmd0aCA+IDAgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiBzZWxmLnN0YXRlLnRpdGxlfSlcclxuICAgICAgICApXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgbm90Q29ubmVjdGVkKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIC8vcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChTZXR0aW5nc1RpdGxlLCB7IHRleHQ6IHNlbGYuc3RhdGUudGl0bGUgfSk7XHJcbiAgICAgICAgbGV0IGNvbHVtbk1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNvbnRlbnRDb2x1bW5EZWZhdWx0KVswXVxyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7a2V5OiBcIm5jY1wiLCByZWY6IFwiY29udGVudFwiLCBjbGFzc05hbWU6IGNvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIFwiK2NvbHVtbk1vZHVsZS5jb250ZW50Q29sdW1uK1wiIGNvbnRlbnQtY29sdW1uIGRlZmF1bHRcIn0sXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMiBtYXJnaW4tcmVzZXQgbWFyZ2luLWJvdHRvbS0yMFwifSxcclxuICAgICAgICAgICAgICAgIFwiTm90IGNvbm5lY3RlZCB0byBkaXNjb3Jkc2VydmVycy5jb20hXCIsXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IHNlbGYuY29ubmVjdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogXCIxOHB4XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVIZWlnaHQ6IFwiMTRweFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1idXR0b24tY29udGVudHNcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQ29ubmVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICApLCBzZWxmLmJkU2VydmVyXHJcbiAgICAgICAgKV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZvb3RlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLXRhYi1iYXItaGVhZGVyXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImFcIixcclxuICAgICAgICAgICAgICAgIHtocmVmOiBcImh0dHBzOi8vZGlzY29yZHNlcnZlcnMuY29tXCIsIHRhcmdldDogXCJfYmxhbmtcIn0sXHJcbiAgICAgICAgICAgICAgICBcIkRpc2NvcmRzZXJ2ZXJzLmNvbVwiXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjb25uZWN0aW9uKCkge1xyXG4gICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgICAgIGNvbnN0IHtjb25uZWN0aW9ufSA9IHNlbGYuc3RhdGU7XHJcbiAgICAgICAgaWYgKGNvbm5lY3Rpb24uc3RhdGUgIT09IDIpIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIsIG51bGwpO1xyXG5cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcInNwYW5cIixcclxuICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFRhYkJhclNlcGFyYXRvciwgbnVsbCksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIFwic3BhblwiLFxyXG4gICAgICAgICAgICAgICAge3N0eWxlOiB7Y29sb3I6IFwiI2I5YmJiZVwiLCBmb250U2l6ZTogXCIxMHB4XCIsIG1hcmdpbkxlZnQ6IFwiMTBweFwifX0sXHJcbiAgICAgICAgICAgICAgICBcIkNvbm5lY3RlZCBhczogXCIsXHJcbiAgICAgICAgICAgICAgICBgJHtjb25uZWN0aW9uLnVzZXIudXNlcm5hbWV9IyR7Y29ubmVjdGlvbi51c2VyLmRpc2NyaW1pbmF0b3J9YFxyXG4gICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge3N0eWxlOiB7cGFkZGluZzogXCI1cHggMTBweCAwIDEwcHhcIn19LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAge3N0eWxlOiB7d2lkdGg6IFwiMTAwJVwiLCBtaW5IZWlnaHQ6IFwiMjBweFwifSwgdHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcInVpLWJ1dHRvbiBmaWxsZWQgYnJhbmQgc21hbGwgZ3Jvd1wifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCIsIG9uQ2xpY2s6IHNlbGYuY29ubmVjdH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiUmVjb25uZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG59XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NlcnZlckNhcmQgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIGlmICghdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCkgdGhpcy5wcm9wcy5zZXJ2ZXIuaWNvblVybCA9IHRoaXMucHJvcHMuZmFsbGJhY2s7XHJcbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgICAgICAgaW1hZ2VFcnJvcjogZmFsc2UsXHJcbiAgICAgICAgICAgIGpvaW5lZDogdGhpcy5wcm9wcy5ndWlsZExpc3QuaW5jbHVkZXModGhpcy5wcm9wcy5zZXJ2ZXIuaWRlbnRpZmllcilcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7c2VydmVyfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgbGV0IGNhcmRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jYXJkICYmIGUuY2FyZFByaW1hcnkpWzBdXHJcbiAgICAgICAgbGV0IGZsZXhNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5mbGV4Q2hpbGQgJiYgZS5faG9yaXpvbnRhbFJldmVyc2UpWzBdXHJcbiAgICAgICAgbGV0IHdyYXBNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5ub1dyYXAgJiYgIWUuc3RyZWFtZXJNb2RlRW5hYmxlZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLCAvLyBjYXJkUHJpbWFyeS0xSHYtdG9cclxuICAgICAgICAgICAge2NsYXNzTmFtZTogYCR7Y2FyZE1vZHVsZS5jYXJkfSAke2NhcmRNb2R1bGUuY2FyZFByaW1hcnl9ICR7QkRNb2R1bGVzLmdldChlID0+IGUubWFyZ2luQm90dG9tOClbMF0ubWFyZ2luQm90dG9tOH0gYmQtc2VydmVyLWNhcmQke3NlcnZlci5waW5uZWQgPyBcIiBiZC1zZXJ2ZXItY2FyZC1waW5uZWRcIiA6IFwiXCJ9YH0sXHJcbiAgICAgICAgICAgIC8vIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgIC8vIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAvLyB7IGNsYXNzTmFtZTogXCJmbGV4LTF4TVFnNSBmbGV4LTFPMUdLWSBob3Jpem9udGFsLTFhZTljaSBob3Jpem9udGFsLTJFRUVuWSBmbGV4LTFPMUdLWSBkaXJlY3Rpb25Sb3ctM3YzdGZHIGp1c3RpZnlTdGFydC0yeUlabzAgYWxpZ25TdHJldGNoLTFod3hNYSBub1dyYXAtM2p5bnY2XCIgfSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImltZ1wiLCB7cmVmOiBcImltZ1wiLCBjbGFzc05hbWU6IFwiYmQtc2VydmVyLWltYWdlXCIsIHNyYzogc2VydmVyLmljb25VcmwsIG9uRXJyb3I6IHRoaXMuaGFuZGxlRXJyb3IuYmluZCh0aGlzKSwgZHJhZ2dhYmxlOiBmYWxzZX0pLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogZmxleE1vZHVsZS5mbGV4Q2hpbGQrXCIgYmQtc2VydmVyLWNvbnRlbnRcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXArXCIgYmQtc2VydmVyLWhlYWRlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJoNVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJoNS0xOF8xbmQgZGVmYXVsdENvbG9yLTFfYWpYMCBtYXJnaW4tcmVzZXQgYmQtc2VydmVyLW5hbWVcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIubmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImg1XCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImg1LTE4XzFuZCBkZWZhdWx0Q29sb3ItMV9halgwIG1hcmdpbi1yZXNldCBiZC1zZXJ2ZXItbWVtYmVyLWNvdW50XCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLm1lbWJlcnMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiBNZW1iZXJzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBmbGV4TW9kdWxlLmhvcml6b250YWwrXCIgXCIrd3JhcE1vZHVsZS5ub1dyYXB9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJzY3JvbGxlcldyYXAtMmxKRWtkIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0SGFpcmxpbmUtREJELTJkIHNjcm9sbGVyRmFkZS0xSWp3NXkgYmQtc2VydmVyLWRlc2NyaXB0aW9uLWNvbnRhaW5lclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2Nyb2xsZXItMkZLRlBHIHNjcm9sbGVyIGJkLXNlcnZlci1kZXNjcmlwdGlvblwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmRlc2NyaXB0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogXCJmbGV4LTF4TVFnNSBmbGV4LTFPMUdLWSBob3Jpem9udGFsLTFhZTljaSBob3Jpem9udGFsLTJFRUVuWSBkaXJlY3Rpb25Sb3ctM3YzdGZHIG5vV3JhcC0zanludjYgYmQtc2VydmVyLWZvb3RlclwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiZmxleENoaWxkLWZhb1ZXMyBiZC1zZXJ2ZXItdGFnc1wiLCBzdHlsZToge2ZsZXg6IFwiMSAxIGF1dG9cIn19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmNhdGVnb3JpZXMuam9pbihcIiwgXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUuam9pbmVkICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gY29sb3JHcmVlbi0yOWlBS1lcIiwgc3R5bGU6IHttaW5IZWlnaHQ6IFwiMTJweFwiLCBtYXJnaW5Ub3A6IFwiNHB4XCIsIGJhY2tncm91bmRDb2xvcjogXCIjM2FjMTVjXCJ9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSm9pbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLmVycm9yICYmIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7dHlwZTogXCJidXR0b25cIiwgY2xhc3NOYW1lOiBcImJ1dHRvbi0zOGFTY3IgbG9va0ZpbGxlZC0xR3gwMFAgY29sb3JCcmFuZC0zcFhyOTEgc2l6ZU1pbi0xbUpkMXggZ3Jvdy1xNzdPTk4gZGlzYWJsZWQtOWFGMnVnXCIsIHN0eWxlOiB7bWluSGVpZ2h0OiBcIjEycHhcIiwgbWFyZ2luVG9wOiBcIjRweFwiLCBiYWNrZ3JvdW5kQ29sb3I6IFwiI2MxM2EzYVwifX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInVpLWJ1dHRvbi1jb250ZW50c1wifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIkVycm9yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgIXNlcnZlci5lcnJvciAmJiAhdGhpcy5zdGF0ZS5qb2luZWQgJiYgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJidXR0b25cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt0eXBlOiBcImJ1dHRvblwiLCBjbGFzc05hbWU6IFwiYnV0dG9uLTM4YVNjciBsb29rRmlsbGVkLTFHeDAwUCBjb2xvckJyYW5kLTNwWHI5MSBzaXplTWluLTFtSmQxeCBncm93LXE3N09OTlwiLCBzdHlsZToge21pbkhlaWdodDogXCIxMnB4XCIsIG1hcmdpblRvcDogXCI0cHhcIn0sIG9uQ2xpY2s6ICgpID0+IHt0aGlzLmpvaW4oKTt9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwidWktYnV0dG9uLWNvbnRlbnRzXCJ9LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSm9pblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIC8vIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGhhbmRsZUVycm9yKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuc2VydmVyLmljb25VcmwgPSB0aGlzLnByb3BzLmZhbGxiYWNrO1xyXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe2ltYWdlRXJyb3I6IHRydWV9KTtcclxuICAgIH1cclxuXHJcbiAgICBqb2luKCkge1xyXG4gICAgICAgIHRoaXMucHJvcHMuam9pbih0aGlzKTtcclxuICAgICAgICAvL3RoaXMuc2V0U3RhdGUoe2pvaW5lZDogdHJ1ZX0pO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uLy4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmltcG9ydCBTY3JvbGxlciBmcm9tIFwiLi4vc2Nyb2xsZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TaWRlYmFyVmlldyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICBjb25zdCB7c2lkZWJhciwgY29udGVudCwgdG9vbHN9ID0gdGhpcy5wcm9wcy5jaGlsZHJlbjtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICB7Y2xhc3NOYW1lOiBcInN0YW5kYXJkU2lkZWJhclZpZXctM0YxSTdpIHVpLXN0YW5kYXJkLXNpZGViYXItdmlld1wifSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwic2lkZWJhclJlZ2lvbi1WRlRVa04gc2lkZWJhci1yZWdpb25cIn0sXHJcbiAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU2Nyb2xsZXIsIHtrZXk6IFwic2lkZWJhclNjcm9sbGVyXCIsIHJlZjogXCJzaWRlYmFyU2Nyb2xsZXJcIiwgc2lkZWJhcjogdHJ1ZSwgZmFkZTogc2lkZWJhci5mYWRlIHx8IHRydWUsIGRhcms6IHNpZGViYXIuZGFyayB8fCB0cnVlfSwgc2lkZWJhci5jb21wb25lbnQpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcImNvbnRlbnRSZWdpb24tM25EdVl5IGNvbnRlbnQtcmVnaW9uXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwiY29udGVudFRyYW5zaXRpb25XcmFwLTNocU9FVyBjb250ZW50LXRyYW5zaXRpb24td3JhcFwifSxcclxuICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJzY3JvbGxlcldyYXAtMmxKRWtkIGZpcmVmb3hGaXhTY3JvbGxGbGV4LWNuSTJpeCBjb250ZW50UmVnaW9uU2Nyb2xsZXJXcmFwLTNZWlhkbSBjb250ZW50LXJlZ2lvbi1zY3JvbGxlci13cmFwIHNjcm9sbGVyVGhlbWVkLTJvZW51cyB0aGVtZUdob3N0LTI4TVNuMCBzY3JvbGxlclRyYWNrLTFaSXBzdlwifSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwic2Nyb2xsZXItMkZLRlBHIGZpcmVmb3hGaXhTY3JvbGxGbGV4LWNuSTJpeCBjb250ZW50UmVnaW9uU2Nyb2xsZXItMjZuYzFlIGNvbnRlbnQtcmVnaW9uLXNjcm9sbGVyIHNjcm9sbGVyXCIsIHJlZjogXCJjb250ZW50U2Nyb2xsZXJcIn0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJjb250ZW50Q29sdW1uLTJocklZSCBjb250ZW50Q29sdW1uRGVmYXVsdC0xVlFrR00gY29udGVudC1jb2x1bW4gZGVmYXVsdFwifSwgY29udGVudC5jb21wb25lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHMuY29tcG9uZW50XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19SZWxvYWRJY29uIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XHJcbiAgICAgICAgICAgICAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxyXG4gICAgICAgICAgICAgICAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcclxuICAgICAgICAgICAgICAgIGZpbGw6IFwiI2RjZGRkZVwiLFxyXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImJkLXJlbG9hZCBcIiArIHRoaXMucHJvcHMuY2xhc3NOYW1lLFxyXG4gICAgICAgICAgICAgICAgb25DbGljazogdGhpcy5wcm9wcy5vbkNsaWNrLFxyXG4gICAgICAgICAgICAgICAgc3R5bGU6IHt3aWR0aDogdGhpcy5wcm9wcy5zaXplIHx8IFwiMjRweFwiLCBoZWlnaHQ6IHRoaXMucHJvcHMuc2l6ZSB8fCBcIjI0cHhcIn1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZDogXCJNMTcuNjUgNi4zNUMxNi4yIDQuOSAxNC4yMSA0IDEyIDRjLTQuNDIgMC03Ljk5IDMuNTgtNy45OSA4czMuNTcgOCA3Ljk5IDhjMy43MyAwIDYuODQtMi41NSA3LjczLTZoLTIuMDhjLS44MiAyLjMzLTMuMDQgNC01LjY1IDQtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNmMxLjY2IDAgMy4xNC42OSA0LjIyIDEuNzhMMTMgMTFoN1Y0bC0yLjM1IDIuMzV6XCJ9KSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7ZmlsbDogXCJub25lXCIsIGQ6IFwiTTAgMGgyNHYyNEgwelwifSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TY3JvbGxlciBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICAvL3Njcm9sbGVyV3JhcC0ybEpFa2Qgc2Nyb2xsZXJUaGVtZWQtMm9lbnVzIHRoZW1lR2hvc3RIYWlybGluZS1EQkQtMmQgc2Nyb2xsZXJGYWRlLTFJanc1eVxyXG4gICAgICAgIGxldCBzY3JvbGxlck1vZHVsZTEgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5zY3JvbGxlckhvcml6b250YWwpWzBdXHJcbiAgICAgICAgbGV0IHNjcm9sbGVyTW9kdWxlMiA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnNpZGViYXJSZWdpb25TY3JvbGxlcilbMF1cclxuICAgICAgICBsZXQgd3JhcHBlckNsYXNzID0gYCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3RIYWlybGluZX0ke3RoaXMucHJvcHMuZmFkZSA/IFwiIFwiK3Njcm9sbGVyTW9kdWxlMS5zY3JvbGxlckZhZGUgOiBcIlwifWA7XHJcbiAgICAgICAgbGV0IHNjcm9sbGVyQ2xhc3MgPSBzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXIrXCIgc2Nyb2xsZXJcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdWNrICovXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuc2lkZWJhcikgc2Nyb2xsZXJDbGFzcyArPSBgICR7c2Nyb2xsZXJNb2R1bGUyLnNpZGViYXJSZWdpb25TY3JvbGxlcn0gc2lkZWJhci1yZWdpb24tc2Nyb2xsZXJgXHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuY29udGVudENvbHVtbikge1xyXG4gICAgICAgICAgICBzY3JvbGxlckNsYXNzICs9IFwiIFwiK3Njcm9sbGVyTW9kdWxlMi5jb250ZW50UmVnaW9uU2Nyb2xsZXIrXCIgY29udGVudC1yZWdpb24tc2Nyb2xsZXJcIjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZ1Y2sgKi9cclxuICAgICAgICAgICAgd3JhcHBlckNsYXNzID0gYCR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyV3JhcH0gJHtzY3JvbGxlck1vZHVsZTIuY29udGVudFJlZ2lvblNjcm9sbGVyV3JhcH0gY29udGVudC1yZWdpb24tc2Nyb2xsZXItd3JhcCAgJHtzY3JvbGxlck1vZHVsZTEuc2Nyb2xsZXJUaGVtZWR9ICR7c2Nyb2xsZXJNb2R1bGUxLnRoZW1lR2hvc3R9ICR7c2Nyb2xsZXJNb2R1bGUxLnNjcm9sbGVyVHJhY2t9YDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qge2NoaWxkcmVufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcclxuICAgICAgICAgICAgXCJkaXZcIixcclxuICAgICAgICAgICAge2tleTogXCJzY3JvbGxlcndyYXBcIiwgY2xhc3NOYW1lOiB3cmFwcGVyQ2xhc3N9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAge2tleTogXCJzY3JvbGxlclwiLCByZWY6IFwic2Nyb2xsZXJcIiwgY2xhc3NOYW1lOiBzY3JvbGxlckNsYXNzfSxcclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuXHJcbiAgICAgICAgICAgIClcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG5jb25zdCBvcmlnaW5hbFJlbmRlciA9IFYyQ19TY3JvbGxlci5wcm90b3R5cGUucmVuZGVyO1xyXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVjJDX1Njcm9sbGVyLnByb3RvdHlwZSwgXCJyZW5kZXJcIiwge1xyXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXHJcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxyXG4gICAgc2V0OiBmdW5jdGlvbigpIHtjb25zb2xlLndhcm4oXCJBZGRvbiBwb2xpY3kgZm9yIHBsdWdpbnMgIzUgaHR0cHM6Ly9naXRodWIuY29tL3JhdWVuemkvQmV0dGVyRGlzY29yZEFwcC93aWtpL0FkZG9uLVBvbGljaWVzI3BsdWdpbnNcIik7fSxcclxuICAgIGdldDogKCkgPT4gb3JpZ2luYWxSZW5kZXJcclxufSk7ICIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5pbXBvcnQgU2V0dGluZ3NHcm91cCBmcm9tIFwiLi9zZXR0aW5nc0dyb3VwXCI7XHJcbmltcG9ydCBNYXJnaW5Ub3AgZnJvbSBcIi4vbWFyZ2ludG9wXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfU2VjdGlvbmVkU2V0dGluZ3NQYW5lbCBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5zZWN0aW9ucy5tYXAoKHNlY3Rpb24sIGkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIFtcclxuICAgICAgICAgICAgICAgIGkgIT09IDAgPyBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoTWFyZ2luVG9wLCB7fSkgOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzR3JvdXAsIE9iamVjdC5hc3NpZ24oe30sIHNlY3Rpb24sIHtvbkNoYW5nZTogdGhpcy5wcm9wcy5vbkNoYW5nZX0pKVxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufSIsImltcG9ydCB7c2V0dGluZ3NDb29raWV9IGZyb20gXCIuLi8wZ2xvYmFsc1wiO1xyXG5pbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFNldHRpbmdzVGl0bGUgZnJvbSBcIi4vc2V0dGluZ3NUaXRsZVwiO1xyXG5pbXBvcnQgU3dpdGNoIGZyb20gXCIuL3N3aXRjaFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1NldHRpbmdzR3JvdXAgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICByZW5kZXIoKSB7XHJcbiAgICAgICAgY29uc3Qge3RpdGxlLCBzZXR0aW5ncywgYnV0dG9ufSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgY29uc3QgYnV0dG9uQ29tcG9uZW50ID0gYnV0dG9uID8gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtrZXk6IFwidGl0bGUtYnV0dG9uXCIsIGNsYXNzTmFtZTogXCJiZC1wZmJ0blwiLCBvbkNsaWNrOiBidXR0b24ub25DbGlja30sIGJ1dHRvbi50aXRsZSkgOiBudWxsO1xyXG4gICAgICAgIHJldHVybiBbQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFNldHRpbmdzVGl0bGUsIHt0ZXh0OiB0aXRsZX0pLFxyXG4gICAgICAgICAgICAgICAgYnV0dG9uQ29tcG9uZW50LFxyXG4gICAgICAgICAgICAgICAgc2V0dGluZ3MubWFwKHNldHRpbmcgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoU3dpdGNoLCB7aWQ6IHNldHRpbmcuaWQsIGtleTogc2V0dGluZy5pZCwgZGF0YTogc2V0dGluZywgY2hlY2tlZDogc2V0dGluZ3NDb29raWVbc2V0dGluZy5pZF0sIG9uQ2hhbmdlOiAoaWQsIGNoZWNrZWQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkNoYW5nZShpZCwgY2hlY2tlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfX0pO1xyXG4gICAgICAgICAgICAgICAgfSldO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19TZXR0aW5nc1RpdGxlIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgIH1cclxuLy9oMi0yZ1dFLW8gdGl0bGUtM3NaV1lRIHNpemUxNi0xNGNHejUgaGVpZ2h0MjAtbU8yZUlOIHdlaWdodFNlbWlCb2xkLU5KZXh6aSBkYS1oMiBkYS10aXRsZSBkYS1zaXplMTYgZGEtaGVpZ2h0MjAgZGEtd2VpZ2h0U2VtaUJvbGQgZGVmYXVsdENvbG9yLTFfYWpYMCBkYS1kZWZhdWx0Q29sb3IgbWFyZ2luVG9wNjAtM1BHYnRLIGRhLW1hcmdpblRvcDYwIG1hcmdpbkJvdHRvbTIwLTMycUlENyBkYS1tYXJnaW5Cb3R0b20yMFxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiaDJcIixcclxuICAgICAgICAgICAge2NsYXNzTmFtZTogXCJ1aS1mb3JtLXRpdGxlIGgyIG1hcmdpbi1yZXNldCBtYXJnaW4tYm90dG9tLTIwXCJ9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFN3aXRjaCBmcm9tIFwiLi9jb21wb25lbnRzL3N3aXRjaFwiO1xyXG5cclxubGV0IGNsYXNzbmFtZXMgPSBbXVxyXG5mdW5jdGlvbiBnZXRDbGFzc05hbWUobmFtZSl7XHJcbiAgICBsZXQgY2xhc3NOYW1lID0gY2xhc3NuYW1lcy5maW5kKGUgPT4gZS5zdGFydHNXaXRoKG5hbWUrXCItXCIpKVxyXG4gICAgaWYoY2xhc3NOYW1lKXJldHVybiBjbGFzc05hbWVcclxuICAgIGNsYXNzTmFtZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlW25hbWVdKVswXVtuYW1lXVxyXG4gICAgY2xhc3NuYW1lcy5wdXNoKGNsYXNzTmFtZSlcclxuICAgIHJldHVybiBjbGFzc05hbWVcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3dpdGNoSXRlbSBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSB0aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DaGFuZ2UoKSB7XHJcbiAgICAgICAgdGhpcy5wcm9wcy5jaGVja2VkID0gIXRoaXMucHJvcHMuY2hlY2tlZDtcclxuICAgICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlKHRoaXMucHJvcHMuaWQsIHRoaXMucHJvcHMuY2hlY2tlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB7dGV4dCwgaW5mb30gPSB0aGlzLnByb3BzLmRhdGE7XHJcbiAgICAgICAgaWYoIWNsYXNzbmFtZXMuZmluZChlID0+IGUuc3RhcnRzV2l0aChcImJldGEtXCIpKSl7XHJcbiAgICAgICAgICAgIGNsYXNzbmFtZXMucHVzaChCRE1vZHVsZXMuZ2V0KGUgPT4gZS5iZXRhICYmICghZS5jb250YWluZXIgJiYgIWUudXNlclNldHRpbmdzVm9pY2UpKVswXS5iZXRhKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZih0aGlzLnByb3BzLmRhdGEuZXhwZXJpbWVudGFsKXtcclxuICAgICAgICAgICAgaW5mbyA9IFtcclxuICAgICAgICAgICAgICAgIGluZm8sXHJcbiAgICAgICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3VwXCIsIHtjbGFzc05hbWU6IGdldENsYXNzTmFtZShcImJldGFcIil9LCBcIihFWFBFUklNRU5UQUwpXCIpXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZsZXggZmxleC12ZXJ0aWNhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwIHVpLXN3aXRjaC1pdGVtXCJ9LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge2NsYXNzTmFtZTogXCJ1aS1mbGV4IGZsZXgtaG9yaXpvbnRhbCBmbGV4LWp1c3RpZnktc3RhcnQgZmxleC1hbGlnbi1zdHJldGNoIGZsZXgtbm93cmFwXCJ9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiaDNcIiwge2tleTogXCJ0aXRsZVwiLCBjbGFzc05hbWU6IFwidWktZm9ybS10aXRsZSBoMyBtYXJnaW4tcmVzZXQgbWFyZ2luLXJlc2V0IHVpLWZsZXgtY2hpbGRcIn0sIHRleHQpLFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFN3aXRjaCwge2tleTogXCJzd2l0Y2hcIiwgb25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsIGNoZWNrZWQ6IHRoaXMucHJvcHMuY2hlY2tlZH0pXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7Y2xhc3NOYW1lOiBcInVpLWZvcm0tdGV4dCBzdHlsZS1kZXNjcmlwdGlvbiBtYXJnaW4tdG9wLTRcIiwgc3R5bGU6IHtmbGV4OiBcIjEgMSBhdXRvXCJ9fSwgaW5mbylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJIZWFkZXIgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIse2NsYXNzTmFtZTogXCJ1aS10YWItYmFyLWhlYWRlclwifSwgdGhpcy5wcm9wcy50ZXh0LCB0aGlzLnByb3BzLmJ1dHRvbik7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1RhYkJhckl0ZW0gZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnNldEluaXRpYWxTdGF0ZSgpO1xyXG4gICAgICAgIHRoaXMub25DbGljayA9IHRoaXMub25DbGljay5iaW5kKHRoaXMpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxTdGF0ZSgpIHtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5wcm9wcy5zZWxlY3RlZCB8fCBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwiZGl2XCIsXHJcbiAgICAgICAgICAgIHtjbGFzc05hbWU6IGB1aS10YWItYmFyLWl0ZW0ke3RoaXMucHJvcHMuc2VsZWN0ZWQgPyBcIiBzZWxlY3RlZFwiIDogXCJcIn1gLCBvbkNsaWNrOiB0aGlzLm9uQ2xpY2t9LFxyXG4gICAgICAgICAgICB0aGlzLnByb3BzLnRleHRcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIG9uQ2xpY2soKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25DbGljaykge1xyXG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uQ2xpY2sodGhpcy5wcm9wcy5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFYyQ19UYWJCYXJTZXBhcmF0b3IgZXh0ZW5kcyBCRFYyLnJlYWN0Q29tcG9uZW50IHtcclxuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XHJcbiAgICAgICAgc3VwZXIocHJvcHMpO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidWktdGFiLWJhci1zZXBhcmF0b3IgbWFyZ2luLXRvcC04IG1hcmdpbi1ib3R0b20tOFwifSk7XHJcbiAgICB9XHJcbn0iLCJpbXBvcnQgQkRWMiBmcm9tIFwiLi4vbW9kdWxlcy92MlwiO1xyXG5cclxuaW1wb3J0IFhTdmcgZnJvbSBcIi4veFN2Z1wiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVjJDX1Rvb2xzIGV4dGVuZHMgQkRWMi5yZWFjdENvbXBvbmVudCB7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICAgICAgdGhpcy5vbkNsaWNrID0gdGhpcy5vbkNsaWNrLmJpbmQodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGxldCB0b29sc01vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLnRvb2xzQ29udGFpbmVyKVswXVxyXG4gICAgICAgIGxldCBjb250YWluZXJNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jb250YWluZXIgJiYgZS5jbG9zZUJ1dHRvbiAmJiBlLmNsb3NlQnV0dG9uQm9sZClbMF1cclxuICAgICAgICByZXR1cm4gQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMtY29udGFpbmVyIFwiK3Rvb2xzTW9kdWxlLnRvb2xzQ29udGFpbmVyfSxcclxuICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IFwidG9vbHMgXCIrdG9vbHNNb2R1bGUudG9vbHN9LFxyXG4gICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtjbGFzc05hbWU6IGNvbnRhaW5lck1vZHVsZS5jb250YWluZXJ9LFxyXG4gICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImJ0bi1jbG9zZSBcIitjb250YWluZXJNb2R1bGUuY2xvc2VCdXR0b24sIG9uQ2xpY2s6IHRoaXMub25DbGlja30sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChYU3ZnLCBudWxsKVxyXG4gICAgICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICAgICAgICAgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRpdlwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiBcImVzYy10ZXh0IFwiK2NvbnRhaW5lck1vZHVsZS5rZXliaW5kfSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJFU0NcIlxyXG4gICAgICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgICAgIClcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgb25DbGljaygpIHtcclxuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkNsaWNrKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25DbGljaygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuXCIrQkRNb2R1bGVzLmdldChlID0+IGUuY2xvc2VCdXR0b24gJiYgZS5rZXliaW5kQm9sZClbMF0uY2xvc2VCdXR0b24uc3BsaXQoXCIgXCIpWzBdKTtcclxuICAgICAgICBpZiAoY2xvc2VCdXR0b24pIGNsb3NlQnV0dG9uLmNsaWNrKCk7XHJcbiAgICB9XHJcbn0iLCIvKipcclxuICogVG9vbHRpcCB0aGF0IGF1dG9tYXRpY2FsbHkgc2hvdyBhbmQgaGlkZSB0aGVtc2VsdmVzIG9uIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG4gKiBXaWxsIGFsc28gcmVtb3ZlIHRoZW1zZWx2ZXMgaWYgdGhlIG5vZGUgdG8gd2F0Y2ggaXMgcmVtb3ZlZCBmcm9tIERPTSB0aHJvdWdoXHJcbiAqIGEgTXV0YXRpb25PYnNlcnZlci5cclxuICpcclxuICogTm90ZSB0aGlzIGlzIG5vdCB1c2luZyBEaXNjb3JkJ3MgaW50ZXJuYWxzIGJ1dCBub3JtYWwgRE9NIG1hbmlwdWxhdGlvbiBhbmQgZW11bGF0ZXNcclxuICogRGlzY29yZCdzIG93biB0b29sdGlwcyBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlLlxyXG4gKlxyXG4gKiBAbW9kdWxlIEVtdWxhdGVkVG9vbHRpcFxyXG4gKiBAdmVyc2lvbiAwLjAuMVxyXG4gKi9cclxuXHJcbmltcG9ydCBVdGlscyBmcm9tIFwiLi4vbW9kdWxlcy91dGlsc1wiO1xyXG5pbXBvcnQgV2VicGFja01vZHVsZXMgZnJvbSBcIi4uL21vZHVsZXMvd2VicGFja01vZHVsZXNcIjtcclxubGV0IFRvb2x0aXBDbGFzc2VzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBDbGFzc2VzKCl7XHJcblx0aWYoVG9vbHRpcENsYXNzZXMpcmV0dXJuIFRvb2x0aXBDbGFzc2VzXHJcblx0cmV0dXJuIFRvb2x0aXBDbGFzc2VzID0gV2VicGFja01vZHVsZXMuZmluZEJ5UHJvcHMoXCJ0b29sdGlwXCIsIFwidG9vbHRpcEJsYWNrXCIpO1xyXG59XHJcbmxldCBUb29sdGlwTGF5ZXJzXHJcbmZ1bmN0aW9uIGdldFRvb2x0aXBMYXllcnMoKXtcclxuXHRpZihUb29sdGlwTGF5ZXJzKXJldHVybiBUb29sdGlwTGF5ZXJzXHJcblx0cmV0dXJuIFRvb2x0aXBMYXllcnMgPSBXZWJwYWNrTW9kdWxlcy5maW5kQnlQcm9wcyhcImxheWVyXCIsIFwibGF5ZXJDb250YWluZXJcIik7XHJcbn1cclxuXHJcbmNvbnN0IGdldENsYXNzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIGNvbnN0IHVwcGVyQ2FzZSA9IHNpZGVPckNvbG9yWzBdLnRvVXBwZXJDYXNlKCkgKyBzaWRlT3JDb2xvci5zbGljZSgxKTtcclxuICAgIGNvbnN0IHRvb2x0aXBDbGFzcyA9IGdldFRvb2x0aXBDbGFzc2VzKClbYHRvb2x0aXAke3VwcGVyQ2FzZX1gXTtcclxuICAgIGlmICh0b29sdGlwQ2xhc3MpIHJldHVybiB0b29sdGlwQ2xhc3M7XHJcbiAgICByZXR1cm4gbnVsbDtcclxufTtcclxuXHJcbmNvbnN0IGNsYXNzRXhpc3RzID0gZnVuY3Rpb24oc2lkZU9yQ29sb3IpIHtcclxuICAgIHJldHVybiBnZXRDbGFzcyhzaWRlT3JDb2xvcikgPyB0cnVlIDogZmFsc2U7XHJcbn07XHJcblxyXG5jb25zdCB0b1B4ID0gZnVuY3Rpb24odmFsdWUpIHtcclxuICAgIHJldHVybiBgJHt2YWx1ZX1weGA7XHJcbn07XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBFbXVsYXRlZFRvb2x0aXAge1xyXG5cdC8qKlxyXG5cdCAqXHJcblx0ICogQGNvbnN0cnVjdG9yXHJcblx0ICogQHBhcmFtIHsoSFRNTEVsZW1lbnR8alF1ZXJ5KX0gbm9kZSAtIERPTSBub2RlIHRvIG1vbml0b3IgYW5kIHNob3cgdGhlIHRvb2x0aXAgb25cclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gdGlwIC0gc3RyaW5nIHRvIHNob3cgaW4gdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHRvb2x0aXBcclxuXHQgKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuc3R5bGU9YmxhY2tdIC0gY29ycmVsYXRlcyB0byB0aGUgZGlzY29yZCBzdHlsaW5nL2NvbG9ycyAoYmxhY2ssIGJyYW5kLCBncmVlbiwgZ3JleSwgcmVkLCB5ZWxsb3cpXHJcblx0ICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNpZGU9dG9wXSAtIGNhbiBiZSBhbnkgb2YgdG9wLCByaWdodCwgYm90dG9tLCBsZWZ0XHJcblx0ICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5wcmV2ZW50RmxpcD1mYWxzZV0gLSBwcmV2ZW50cyBtb3ZpbmcgdGhlIHRvb2x0aXAgdG8gdGhlIG9wcG9zaXRlIHNpZGUgaWYgaXQgaXMgdG9vIGJpZyBvciBnb2VzIG9mZnNjcmVlblxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5kaXNhYmxlZD1mYWxzZV0gLSB3aGV0aGVyIHRoZSB0b29sdGlwIHNob3VsZCBiZSBkaXNhYmxlZCBmcm9tIHNob3dpbmcgb24gaG92ZXJcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuYXR0YWNoRXZlbnRzPXRydWVdIC0gd2hldGhlciB0aGUgdG9vbHRpcCBzaG91bGQgbGlzdGVuIHRvIG1vdXNlZW50ZXIgYW5kIG1vdXNlbGVhdmUgZXZlbnRzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKG5vZGUsIHRleHQsIG9wdGlvbnMgPSB7fSkge1xyXG5cdFx0Y29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgcHJldmVudEZsaXAgPSBmYWxzZSwgZGlzYWJsZWQgPSBmYWxzZSwgYXR0YWNoRXZlbnRzID0gdHJ1ZX0gPSBvcHRpb25zO1xyXG5cdFx0dGhpcy5ub2RlID0gbm9kZSBpbnN0YW5jZW9mIGpRdWVyeSA/IG5vZGVbMF0gOiBub2RlO1xyXG4gICAgICAgIHRoaXMubGFiZWwgPSB0ZXh0O1xyXG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0dGhpcy5zaWRlID0gc2lkZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIHRoaXMucHJldmVudEZsaXAgPSBwcmV2ZW50RmxpcDtcclxuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XHJcblxyXG4gICAgICAgIGlmICghY2xhc3NFeGlzdHModGhpcy5zaWRlKSkgcmV0dXJuIFV0aWxzLmVycihcIkVtdWxhdGVkVG9vbHRpcFwiLCBgU2lkZSAke3RoaXMuc2lkZX0gZG9lcyBub3QgZXhpc3QuYCk7XHJcblx0XHRpZiAoIWNsYXNzRXhpc3RzKHRoaXMuc3R5bGUpKSByZXR1cm4gVXRpbHMuZXJyKFwiRW11bGF0ZWRUb29sdGlwXCIsIGBTdHlsZSAke3RoaXMuc3R5bGV9IGRvZXMgbm90IGV4aXN0LmApO1xyXG5cdFx0XHJcblx0XHR0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBMYXllcnMoKS5sYXllciArIFwiIFwiICsgZ2V0VG9vbHRpcExheWVycygpLmRpc2FibGVkUG9pbnRlckV2ZW50cztcclxuXHJcblx0XHR0aGlzLnRvb2x0aXBFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NOYW1lID0gYCR7Z2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwfSAke2dldENsYXNzKHRoaXMuc3R5bGUpfWA7XHJcblxyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQuY2xhc3NOYW1lID0gZ2V0VG9vbHRpcENsYXNzZXMoKS50b29sdGlwQ29udGVudFxyXG5cclxuXHRcdGNvbnN0IHBvaW50ZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcclxuXHRcdHBvaW50ZXJFbGVtZW50LmNsYXNzTmFtZSA9IGdldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcFBvaW50ZXI7XHJcblxyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQocG9pbnRlckVsZW1lbnQpO1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5hcHBlbmQodGhpcy5sYWJlbEVsZW1lbnQpO1xyXG5cdFx0dGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLnRvb2x0aXBFbGVtZW50KTtcclxuXHJcblx0XHRpZihhdHRhY2hFdmVudHMpe1xyXG5cdFx0XHR0aGlzLm5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZW50ZXJcIiwgKCkgPT4ge1xyXG5cdFx0XHRcdGlmICh0aGlzLmRpc2FibGVkKSByZXR1cm47XHJcblx0XHRcdFx0dGhpcy5zaG93KCk7XHJcblx0XHJcblx0XHRcdFx0Y29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XHJcblx0XHRcdFx0XHRtdXRhdGlvbnMuZm9yRWFjaCgobXV0YXRpb24pID0+IHtcclxuXHRcdFx0XHRcdFx0Y29uc3Qgbm9kZXMgPSBBcnJheS5mcm9tKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7XHJcblx0XHRcdFx0XHRcdGNvbnN0IGRpcmVjdE1hdGNoID0gbm9kZXMuaW5kZXhPZih0aGlzLm5vZGUpID4gLTE7XHJcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudE1hdGNoID0gbm9kZXMuc29tZShwYXJlbnQgPT4gcGFyZW50LmNvbnRhaW5zKHRoaXMubm9kZSkpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZGlyZWN0TWF0Y2ggfHwgcGFyZW50TWF0Y2gpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0XHRcdFx0XHRvYnNlcnZlci5kaXNjb25uZWN0KCk7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH0pO1xyXG5cdFxyXG5cdFx0XHRcdG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge3N1YnRyZWU6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZX0pO1xyXG5cdFx0XHR9KTtcclxuXHRcclxuXHRcdFx0dGhpcy5ub2RlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsICgpID0+IHtcclxuXHRcdFx0XHR0aGlzLmhpZGUoKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbnRhaW5lciB3aGVyZSB0aGUgdG9vbHRpcCB3aWxsIGJlIGFwcGVuZGVkLiAqL1xyXG4gICAgZ2V0IGNvbnRhaW5lcigpIHsgXHJcblx0XHRyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5wb3BvdXRzKVswXS5wb3BvdXRzKStcIiB+IC5cIitVdGlscy5yZW1vdmVEYShCRE1vZHVsZXMuZ2V0KGUgPT4gZS5sYXllckNvbnRhaW5lcilbMF0ubGF5ZXJDb250YWluZXIpKTsgXHJcblx0fVxyXG4gICAgLyoqIEJvb2xlYW4gcmVwcmVzZW50aW5nIGlmIHRoZSB0b29sdGlwIHdpbGwgZml0IG9uIHNjcmVlbiBhYm92ZSB0aGUgZWxlbWVudCAqL1xyXG4gICAgZ2V0IGNhblNob3dBYm92ZSgpIHsgcmV0dXJuIHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0ID49IDA7IH1cclxuICAgIC8qKiBCb29sZWFuIHJlcHJlc2VudGluZyBpZiB0aGUgdG9vbHRpcCB3aWxsIGZpdCBvbiBzY3JlZW4gYmVsb3cgdGhlIGVsZW1lbnQgKi9cclxuICAgIGdldCBjYW5TaG93QmVsb3coKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQgPD0gVXRpbHMuc2NyZWVuSGVpZ2h0OyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSBsZWZ0IG9mIHRoZSBlbGVtZW50ICovXHJcbiAgICBnZXQgY2FuU2hvd0xlZnQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA+PSAwOyB9XHJcbiAgICAvKiogQm9vbGVhbiByZXByZXNlbnRpbmcgaWYgdGhlIHRvb2x0aXAgd2lsbCBmaXQgb24gc2NyZWVuIHRvIHRoZSByaWdodCBvZiB0aGUgZWxlbWVudCAqL1xyXG5cdGdldCBjYW5TaG93UmlnaHQoKSB7IHJldHVybiB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMubm9kZS5vZmZzZXRXaWR0aCArIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aCA8PSBVdGlscy5zY3JlZW5XaWR0aDsgfVxyXG5cclxuICAgIC8qKiBIaWRlcyB0aGUgdG9vbHRpcC4gQXV0b21hdGljYWxseSBjYWxsZWQgb24gbW91c2VsZWF2ZS4gKi9cclxuXHRoaWRlKCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmUoKTtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IHRoaXMuX2NsYXNzTmFtZTtcclxuXHR9XHJcblxyXG4gICAgLyoqIFNob3dzIHRoZSB0b29sdGlwLiBBdXRvbWF0aWNhbGx5IGNhbGxlZCBvbiBtb3VzZWVudGVyLiBXaWxsIGF0dGVtcHQgdG8gZmxpcCBpZiBwb3NpdGlvbiB3YXMgd3JvbmcuICovXHJcblx0c2hvdygpIHtcclxuICAgICAgICB0aGlzLnRvb2x0aXBFbGVtZW50LmNsYXNzTmFtZSA9IGAke2dldFRvb2x0aXBDbGFzc2VzKCkudG9vbHRpcH0gJHtnZXRDbGFzcyh0aGlzLnN0eWxlKX1gO1xyXG5cdFx0dGhpcy5sYWJlbEVsZW1lbnQudGV4dENvbnRlbnQgPSB0aGlzLmxhYmVsO1xyXG5cdFx0dGhpcy5jb250YWluZXIuYXBwZW5kKHRoaXMuZWxlbWVudCk7XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcInRvcFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dBYm92ZSB8fCAoIXRoaXMuY2FuU2hvd0Fib3ZlICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dBYm92ZSgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0JlbG93KCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImJvdHRvbVwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dCZWxvdyB8fCAoIXRoaXMuY2FuU2hvd0JlbG93ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dCZWxvdygpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0Fib3ZlKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMuc2lkZSA9PSBcImxlZnRcIikge1xyXG5cdFx0XHRpZiAodGhpcy5jYW5TaG93TGVmdCB8fCAoIXRoaXMuY2FuU2hvd0xlZnQgJiYgdGhpcy5wcmV2ZW50RmxpcCkpIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdFx0ZWxzZSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdGlmICh0aGlzLnNpZGUgPT0gXCJyaWdodFwiKSB7XHJcblx0XHRcdGlmICh0aGlzLmNhblNob3dSaWdodCB8fCAoIXRoaXMuY2FuU2hvd1JpZ2h0ICYmIHRoaXMucHJldmVudEZsaXApKSB0aGlzLnNob3dSaWdodCgpO1xyXG5cdFx0XHRlbHNlIHRoaXMuc2hvd0xlZnQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG4gICAgLyoqIEZvcmNlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWJvdmUgdGhlIG5vZGUuICovXHJcblx0c2hvd0Fib3ZlKCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwidG9wXCIpKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLmVsZW1lbnQub2Zmc2V0SGVpZ2h0IC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVySG9yaXpvbnRhbGx5KCk7XHJcblx0fVxyXG5cclxuICAgIC8qKiBGb3JjZSBzaG93aW5nIHRoZSB0b29sdGlwIGJlbG93IHRoZSBub2RlLiAqL1xyXG5cdHNob3dCZWxvdygpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImJvdHRvbVwiKSk7XHJcblx0XHR0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0b3BcIiwgdG9QeCh0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgdGhpcy5ub2RlLm9mZnNldEhlaWdodCArIDEwKSk7XHJcblx0XHR0aGlzLmNlbnRlckhvcml6b250YWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgbGVmdCBvZiB0aGUgbm9kZS4gKi9cclxuXHRzaG93TGVmdCgpIHtcclxuXHRcdHRoaXMudG9vbHRpcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhcImxlZnRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gdGhpcy5lbGVtZW50Lm9mZnNldFdpZHRoIC0gMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcbiAgICAvKiogRm9yY2Ugc2hvd2luZyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIG5vZGUuICovXHJcblx0c2hvd1JpZ2h0KCkge1xyXG5cdFx0dGhpcy50b29sdGlwRWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwicmlnaHRcIikpO1xyXG5cdFx0dGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KFwibGVmdFwiLCB0b1B4KHRoaXMubm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgdGhpcy5ub2RlLm9mZnNldFdpZHRoICsgMTApKTtcclxuXHRcdHRoaXMuY2VudGVyVmVydGljYWxseSgpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVySG9yaXpvbnRhbGx5KCkge1xyXG4gICAgICAgIGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArICh0aGlzLm5vZGUub2Zmc2V0V2lkdGggLyAyKTtcclxuICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJsZWZ0XCIsIHRvUHgobm9kZWNlbnRlciAtICh0aGlzLmVsZW1lbnQub2Zmc2V0V2lkdGggLyAyKSkpO1xyXG5cdH1cclxuXHJcblx0Y2VudGVyVmVydGljYWxseSgpIHtcclxuXHRcdGNvbnN0IG5vZGVjZW50ZXIgPSB0aGlzLm5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKHRoaXMubm9kZS5vZmZzZXRIZWlnaHQgLyAyKTtcclxuXHRcdHRoaXMuZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRvcFwiLCB0b1B4KG5vZGVjZW50ZXIgLSAodGhpcy5lbGVtZW50Lm9mZnNldEhlaWdodCAvIDIpKSk7XHJcblx0fVxyXG59IiwiaW1wb3J0IEJEVjIgZnJvbSBcIi4uL21vZHVsZXMvdjJcIjtcclxuaW1wb3J0IFRvb2x0aXAgZnJvbSBcIi4vdG9vbHRpcFwiO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3Qge3N0eWxlID0gXCJibGFja1wiLCBzaWRlID0gXCJ0b3BcIiwgdGV4dCA9IFwiXCJ9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLm5vZGUgPSBCRFYyLnJlYWN0RG9tLmZpbmRET01Ob2RlKHRoaXMpO1xyXG4gICAgICAgIHRoaXMudG9vbHRpcCA9IG5ldyBUb29sdGlwKHRoaXMubm9kZSwgdGV4dCwge3N0eWxlLCBzaWRlfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XHJcbiAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTtcclxuICAgICAgICBkZWxldGUgdGhpcy50b29sdGlwO1xyXG4gICAgfVxyXG5cclxuICAgIHJlbmRlcigpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbjtcclxuICAgIH1cclxufSIsImltcG9ydCBCRFYyIGZyb20gXCIuLi9tb2R1bGVzL3YyXCI7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWMkNfWFN2ZyBleHRlbmRzIEJEVjIucmVhY3RDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcclxuICAgICAgICBzdXBlcihwcm9wcyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIHJldHVybiBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgIFwic3ZnXCIsXHJcbiAgICAgICAgICAgIHt4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLCB2aWV3Qm94OiBcIjAgMCAxMiAxMlwiLCBzdHlsZToge3dpZHRoOiBcIjE4cHhcIiwgaGVpZ2h0OiBcIjE4cHhcIn19LFxyXG4gICAgICAgICAgICBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXHJcbiAgICAgICAgICAgICAgICBcImdcIixcclxuICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6IFwiYmFja2dyb3VuZFwiLCBmaWxsOiBcIm5vbmVcIiwgZmlsbFJ1bGU6IFwiZXZlbm9kZFwifSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2Q6IFwiTTAgMGgxMnYxMkgwXCJ9KSxcclxuICAgICAgICAgICAgICAgIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge2NsYXNzTmFtZTogXCJmaWxsXCIsIGZpbGw6IFwiI2RjZGRkZVwiLCBkOiBcIk05LjUgMy4yMDVMOC43OTUgMi41IDYgNS4yOTUgMy4yMDUgMi41bC0uNzA1LjcwNUw1LjI5NSA2IDIuNSA4Ljc5NWwuNzA1LjcwNUw2IDYuNzA1IDguNzk1IDkuNWwuNzA1LS43MDVMNi43MDUgNlwifSlcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcbn0iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJjcnlwdG9cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZWxlY3Ryb25cIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZXZlbnRzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImZzXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIm1vZHVsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJub2RlLWZldGNoXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInBhdGhcIik7Il0sInNvdXJjZVJvb3QiOiIifQ== |